tree.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 131 行

HPP
131
字号
/*=============================================================================   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 <boost/mpl/if.hpp>#include <boost/type_traits/is_const.hpp>#include <boost/type_traits/add_const.hpp>#include <boost/type_traits/add_reference.hpp>#include <boost/fusion/support/is_sequence.hpp>#include <boost/fusion/sequence/intrinsic/at.hpp>#include <boost/fusion/view/single_view.hpp>#include <boost/fusion/container/list/cons.hpp> // for nil#include <boost/fusion/container/vector/vector10.hpp>#include <boost/fusion/support/sequence_base.hpp>#include <boost/fusion/sequence/intrinsic/ext_/segments.hpp>#include <boost/fusion/support/ext_/is_segmented.hpp>#include <boost/fusion/view/ext_/segmented_iterator.hpp>namespace boost { namespace fusion{   struct tree_tag;   namespace detail   {       template<typename T, bool IsConst>       struct reference : add_reference<T> {};       template<typename T>       struct reference<T, true> : reference<typename add_const<T>::type, false> {};       template<typename T>       struct reference<T &, true> : reference<T, false> {};   }   template<typename Data, typename Left = nil, typename Right = nil>   struct tree     : sequence_base<tree<Data, Left, Right> >   {       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>         , Data         , single_view<Data>       >::type data_view;       explicit tree(           typename fusion::detail::call_param<Data>::type data_         , typename fusion::detail::call_param<Left>::type left_ = Left()         , typename fusion::detail::call_param<Right>::type right_ = Right()       )         : segments(left_, data_view(data_), right_)       {}       typedef vector3<Left, data_view, Right> segments_type;       segments_type segments;   };   template<typename Data>   tree<Data> make_tree(Data const &data)   {       return tree<Data>(data);   }   template<typename Data, typename Left, typename Right>   tree<Data, Left, Right> make_tree(Data const &data, Left const &left, Right const &right)   {       return tree<Data, Left, Right>(data, left, right);   }   namespace extension   {       template<>       struct is_segmented_impl<tree_tag>       {           template<typename Sequence>           struct apply : mpl::true_ {};       };       template<>       struct segments_impl<tree_tag>       {           template<typename Sequence>           struct apply           {               typedef typename mpl::if_<                   is_const<Sequence>                 , typename Sequence::segments_type const &                 , typename Sequence::segments_type &               >::type type;               static type call(Sequence &seq)               {                   return seq.segments;               }           };       };       template<>       struct begin_impl<tree_tag>       {           template<typename Sequence>           struct apply             : segmented_begin<Sequence>           {};       };       template<>       struct end_impl<tree_tag>       {           template<typename Sequence>           struct apply             : segmented_end<Sequence>           {};       };   }}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?