// (C) Copyright Jeremy Siek 1999. | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef BOOST_TREE_STRUCTURE_HPP | |
#define BOOST_TREE_STRUCTURE_HPP | |
namespace boost { | |
template <class T> | |
struct tree_traits { | |
typedef typename T::node_descriptor node_descriptor; | |
typedef typename T::children_iterator children_iterator; | |
}; | |
template <class Tree, class TreeVisitor> | |
void traverse_tree(typename tree_traits<Tree>::node_descriptor v, | |
Tree& t, TreeVisitor visitor) | |
{ | |
visitor.preorder(v, t); | |
typename tree_traits<Tree>::children_iterator i, end; | |
boost::tie(i, end) = children(v, t); | |
if (i != end) { | |
traverse_tree(*i++, t, visitor); | |
visitor.inorder(v, t); | |
while (i != end) | |
traverse_tree(*i++, t, visitor); | |
} else | |
visitor.inorder(v, t); | |
visitor.postorder(v, t); | |
} | |
struct null_tree_visitor { | |
template <typename Node, typename Tree> void preorder(Node, Tree&) { } | |
template <typename Node, typename Tree> void inorder(Node, Tree&) { } | |
template <typename Node, typename Tree> void postorder(Node, Tree&) { } | |
}; | |
} /* namespace boost */ | |
#endif /* BOOST_TREE_STRUCTURE_HPP */ |