diff options
author | yoni206 <yoni206@users.noreply.github.com> | 2019-07-22 22:39:59 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-22 22:39:59 -0700 |
commit | 5b494f33f146677386385fc7d055f95d9aae08d5 (patch) | |
tree | 603751d479cf69281d7c40658478e9bedda90048 /src/expr/node_algorithm.cpp | |
parent | 5d203980cb011ce0a9aa5007d4792c1f80dd1e4b (diff) |
Get operators in node (#3094)
This commit adds a function to node_algorithm.{h,cpp} that returns the operators that occur in a given node.
Diffstat (limited to 'src/expr/node_algorithm.cpp')
-rw-r--r-- | src/expr/node_algorithm.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/expr/node_algorithm.cpp b/src/expr/node_algorithm.cpp index 841f9ea28..c20dddbcc 100644 --- a/src/expr/node_algorithm.cpp +++ b/src/expr/node_algorithm.cpp @@ -304,6 +304,47 @@ void getSymbols(TNode n, } while (!visit.empty()); } +void getOperatorsMap( + TNode n, + std::map<TypeNode, std::unordered_set<Node, NodeHashFunction>>& ops) +{ + std::unordered_set<TNode, TNodeHashFunction> visited; + getOperatorsMap(n, ops, visited); +} + +void getOperatorsMap( + TNode n, + std::map<TypeNode, std::unordered_set<Node, NodeHashFunction>>& ops, + std::unordered_set<TNode, TNodeHashFunction>& visited) +{ + // nodes that we still need to visit + std::vector<TNode> visit; + // current node + TNode cur; + visit.push_back(n); + do + { + cur = visit.back(); + visit.pop_back(); + // if cur is in the cache, do nothing + if (visited.find(cur) == visited.end()) + { + // fetch the correct type + TypeNode tn = cur.getType(); + // add the current operator to the result + if (cur.hasOperator()) + { + ops[tn].insert(NodeManager::currentNM()->operatorOf(cur.getKind())); + } + // add children to visit in the future + for (TNode cn : cur) + { + visit.push_back(cn); + } + } + } while (!visit.empty()); +} + Node substituteCaptureAvoiding(TNode n, Node src, Node dest) { if (n == src) |