boost/xpressive/proto/transform/fold_tree.hpp
/////////////////////////////////////////////////////////////////////////////// /// \file fold_tree.hpp /// A higher-level transform that uses the fold, and branch transforms /// to recursively fold a tree. // // Copyright 2007 Eric Niebler. 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_PROTO_TRANSFORM_FOLD_TREE_HPP_EAN_06_18_2007 #define BOOST_PROTO_TRANSFORM_FOLD_TREE_HPP_EAN_06_18_2007 #include <boost/xpressive/proto/detail/prefix.hpp> #include <boost/xpressive/proto/transform/fold.hpp> #include <boost/xpressive/proto/detail/suffix.hpp> namespace boost { namespace proto { namespace transform { namespace detail { template<typename Tag, typename Grammar> struct fold_tree_ : or_< transform::fold< nary_expr<Tag, vararg<fold_tree_<Tag, Grammar> > > > , Grammar > {}; template<typename Tag, typename Grammar> struct reverse_fold_tree_ : or_< transform::reverse_fold< nary_expr<Tag, vararg<reverse_fold_tree_<Tag, Grammar> > > > , Grammar > {}; } /// fold_tree /// template<typename Tag, typename Grammar, typename State> struct fold_tree : transform::fold< nary_expr<Tag, vararg<detail::fold_tree_<Tag, Grammar> > > , State > {}; /// reverse_fold_tree /// template<typename Tag, typename Grammar, typename State> struct reverse_fold_tree : transform::reverse_fold< nary_expr<Tag, vararg<detail::reverse_fold_tree_<Tag, Grammar> > > , State > {}; }}} namespace boost { namespace proto { template<typename Tag, typename Grammar, typename State> struct is_transform<transform::fold_tree<Tag, Grammar, State> > : mpl::true_ {}; template<typename Tag, typename Grammar, typename State> struct is_transform<transform::reverse_fold_tree<Tag, Grammar, State> > : mpl::true_ {}; }} #endif