tree_traits.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // (C) Copyright Jeremy Siek 1999.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_TREE_STRUCTURE_HPP
  6. #define BOOST_TREE_STRUCTURE_HPP
  7. #include <boost/tuple/tuple.hpp> //For boost::tie()
  8. namespace boost {
  9. template <class T>
  10. struct tree_traits {
  11. typedef typename T::node_descriptor node_descriptor;
  12. typedef typename T::children_iterator children_iterator;
  13. };
  14. template <class Tree, class TreeVisitor>
  15. void traverse_tree(typename tree_traits<Tree>::node_descriptor v,
  16. Tree& t, TreeVisitor visitor)
  17. {
  18. visitor.preorder(v, t);
  19. typename tree_traits<Tree>::children_iterator i, end;
  20. boost::tie(i, end) = children(v, t);
  21. if (i != end) {
  22. traverse_tree(*i++, t, visitor);
  23. visitor.inorder(v, t);
  24. while (i != end)
  25. traverse_tree(*i++, t, visitor);
  26. } else
  27. visitor.inorder(v, t);
  28. visitor.postorder(v, t);
  29. }
  30. struct null_tree_visitor {
  31. template <typename Node, typename Tree> void preorder(Node, Tree&) { }
  32. template <typename Node, typename Tree> void inorder(Node, Tree&) { }
  33. template <typename Node, typename Tree> void postorder(Node, Tree&) { }
  34. };
  35. } /* namespace boost */
  36. #endif /* BOOST_TREE_STRUCTURE_HPP */