/*============================================================================= 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; namespace detail { template struct reference : add_reference {}; template struct reference : reference::type, false> {}; template struct reference : reference {}; } 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; } }; }; template<> struct begin_impl { template struct apply : segmented_begin {}; }; template<> struct end_impl { template struct apply : segmented_end {}; }; } }} #endif