|
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 |
|
6 #ifndef BOOST_TREE_STRUCTURE_HPP |
|
7 #define BOOST_TREE_STRUCTURE_HPP |
|
8 |
|
9 namespace boost { |
|
10 |
|
11 template <class T> |
|
12 struct tree_traits { |
|
13 typedef typename T::node_descriptor node_descriptor; |
|
14 typedef typename T::children_iterator children_iterator; |
|
15 }; |
|
16 |
|
17 |
|
18 template <class Tree, class TreeVisitor> |
|
19 void traverse_tree(typename tree_traits<Tree>::node_descriptor v, |
|
20 Tree& t, TreeVisitor visitor) |
|
21 { |
|
22 visitor.preorder(v, t); |
|
23 typename tree_traits<Tree>::children_iterator i, end; |
|
24 tie(i, end) = children(v, t); |
|
25 if (i != end) { |
|
26 traverse_tree(*i++, t, visitor); |
|
27 visitor.inorder(v, t); |
|
28 while (i != end) |
|
29 traverse_tree(*i++, t, visitor); |
|
30 } else |
|
31 visitor.inorder(v, t); |
|
32 visitor.postorder(v, t); |
|
33 } |
|
34 |
|
35 struct null_tree_visitor { |
|
36 template <typename Node, typename Tree> void preorder(Node, Tree&) { } |
|
37 template <typename Node, typename Tree> void inorder(Node, Tree&) { } |
|
38 template <typename Node, typename Tree> void postorder(Node, Tree&) { } |
|
39 }; |
|
40 |
|
41 } /* namespace boost */ |
|
42 |
|
43 #endif /* BOOST_TREE_STRUCTURE_HPP */ |