/*============================================================================= Copyright (c) 2006 Eric Niebler Use, modification and distribution is subject to 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 FUSION_BINARY_TREE_EAN_05032006_1027 #define FUSION_BINARY_TREE_EAN_05032006_1027 #include #include #include #include #include #include #include #include // for nil #include #include #include #include #include namespace boost { namespace fusion { struct tree_tag; template struct tree : sequence_base > { typedef Data data_type; typedef Left left_type; typedef Right right_type; typedef tree_tag fusion_tag; typedef forward_traversal_tag category; typedef mpl::false_ is_view; typedef typename mpl::if_< traits::is_sequence , Data , single_view >::type data_view; explicit tree( typename fusion::detail::call_param::type data_ , typename fusion::detail::call_param::type left_ = Left() , typename fusion::detail::call_param::type right_ = Right() ) : segments(left_, data_view(data_), right_) {} typedef vector3 segments_type; segments_type segments; }; template tree make_tree(Data const &data) { return tree(data); } template tree make_tree(Data const &data, Left const &left, Right const &right) { return tree(data, left, right); } namespace extension { template <> struct is_segmented_impl { template struct apply : mpl::true_ {}; }; template <> struct segments_impl { template struct apply { typedef typename mpl::if_< is_const , typename Sequence::segments_type const & , typename Sequence::segments_type & >::type type; static type call(Sequence &seq) { return seq.segments; } }; }; } }} #endif