summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlex Ozdemir <aozdemir@hmc.edu>2020-04-11 10:16:05 -0700
committerGitHub <noreply@github.com>2020-04-11 12:16:05 -0500
commit0073464e433e80311269ce07e0fa5de417b5eefc (patch)
treee42eafe127a7135057e98ca1c0222c548ac80975 /test
parent4e310461b2e41f9ccf1426797b5d8b58e27bc1c7 (diff)
Add skip predicate to node traversal. (#4222)
Sometime you want to skip specific sub-DAGs when traversing a node. For example, you might be doing a transformation with a cache, and want to skip sub-DAGs that you've already processed. This PR would add a skipIf builder method to NodeDfsIterable, which allows the user to provide a predicate according to which nodes will be omitted from the subsequent traversal.
Diffstat (limited to 'test')
-rw-r--r--test/unit/expr/node_traversal_black.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/unit/expr/node_traversal_black.h b/test/unit/expr/node_traversal_black.h
index b4a7c449c..b751a0999 100644
--- a/test/unit/expr/node_traversal_black.h
+++ b/test/unit/expr/node_traversal_black.h
@@ -161,6 +161,22 @@ class NodePostorderTraversalBlack : public CxxTest::TestSuite
std::copy(traversal.begin(), traversal.end(), std::back_inserter(actual));
TS_ASSERT_EQUALS(actual, expected);
}
+
+ void testSkipIf()
+ {
+ Node tb = d_nodeManager->mkConst(true);
+ Node eb = d_nodeManager->mkConst(false);
+ Node cnd = d_nodeManager->mkNode(XOR, tb, eb);
+ Node top = d_nodeManager->mkNode(XOR, cnd, cnd);
+ std::vector<TNode> expected = {top};
+
+ auto traversal = NodeDfsIterable(top).inPostorder().skipIf(
+ [&cnd](TNode n) { return n == cnd; });
+
+ std::vector<TNode> actual;
+ std::copy(traversal.begin(), traversal.end(), std::back_inserter(actual));
+ TS_ASSERT_EQUALS(actual, expected);
+ }
};
class NodePreorderTraversalBlack : public CxxTest::TestSuite
@@ -278,4 +294,20 @@ class NodePreorderTraversalBlack : public CxxTest::TestSuite
std::copy(traversal.begin(), traversal.end(), std::back_inserter(actual));
TS_ASSERT_EQUALS(actual, expected);
}
+
+ void testSkipIf()
+ {
+ Node tb = d_nodeManager->mkConst(true);
+ Node eb = d_nodeManager->mkConst(false);
+ Node cnd = d_nodeManager->mkNode(XOR, tb, eb);
+ Node top = d_nodeManager->mkNode(XOR, cnd, cnd);
+ std::vector<TNode> expected = {top, cnd, eb};
+
+ auto traversal = NodeDfsIterable(top).inPreorder().skipIf(
+ [&tb](TNode n) { return n == tb; });
+
+ std::vector<TNode> actual;
+ std::copy(traversal.begin(), traversal.end(), std::back_inserter(actual));
+ TS_ASSERT_EQUALS(actual, expected);
+ }
};
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback