| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | //  (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#include <boost/tuple/tuple.hpp> //For boost::tie()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 */
 |