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