void AST_t::tree_iterator(const AST_t& a, const TraverseASTFunctor& functor, ObjectList<AST_t>& result) { AST tree = a._ast; if (tree == NULL) return; ASTTraversalResult current_node = functor(a); if (current_node.matches()) { result.push_back(a); } if (current_node.recurse()) { for (int i = 0; i < ASTNumChildren(tree); i++) { if (ASTChild(tree, i) != NULL) { AST_t iterate(ASTChild(tree, i)); tree_iterator(iterate, functor, result); } } } }
ObjectList<AST_t> AST_t::depth_subtrees(const TraverseASTFunctor& functor) const { ObjectList<AST_t> result; tree_iterator(*this, functor, result); return result; }
ObjectList<AST_t> AST_t::depth_subtrees(const Predicate<AST_t>& pred, RecursiveFlag recursive_flag) const { ObjectList<AST_t> result; // Construct a functor that emulates old behaviour TraverseASTPredicate compat_functor(pred, recursive_flag); tree_iterator(*this, compat_functor, result); return result; }
tree_iterator end_iterator_from_it() const { return tree_iterator(node_algorithms::get_header(this->pointed_node()), this->get_value_traits()); }