721 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			721 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /////////////////////////////////////////////////////////////////////////////// | ||
|  | /// \file fusion.hpp | ||
|  | /// Make any Proto expression a valid Fusion sequence | ||
|  | // | ||
|  | //  Copyright 2008 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_FUSION_HPP_EAN_11_04_2006 | ||
|  | #define BOOST_PROTO_FUSION_HPP_EAN_11_04_2006 | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/mpl/if.hpp> | ||
|  | #include <boost/mpl/bool.hpp> | ||
|  | #include <boost/mpl/long.hpp> | ||
|  | #include <boost/mpl/sequence_tag_fwd.hpp> | ||
|  | #include <boost/utility/enable_if.hpp> | ||
|  | #include <boost/fusion/include/is_view.hpp> | ||
|  | #include <boost/fusion/include/tag_of_fwd.hpp> | ||
|  | #include <boost/fusion/include/category_of.hpp> | ||
|  | #include <boost/fusion/include/iterator_base.hpp> | ||
|  | #include <boost/fusion/include/intrinsic.hpp> | ||
|  | #include <boost/fusion/include/single_view.hpp> | ||
|  | #include <boost/fusion/include/transform.hpp> | ||
|  | #include <boost/fusion/include/as_list.hpp> | ||
|  | #include <boost/fusion/include/is_segmented.hpp> | ||
|  | #include <boost/fusion/sequence/comparison/enable_comparison.hpp> | ||
|  | #include <boost/proto/proto_fwd.hpp> | ||
|  | #include <boost/proto/traits.hpp> | ||
|  | #include <boost/proto/eval.hpp> | ||
|  | #include <boost/proto/make_expr.hpp> | ||
|  | 
 | ||
|  | #ifdef BOOST_MSVC | ||
|  | #pragma warning(push) | ||
|  | #pragma warning(disable : 4510) // default constructor could not be generated | ||
|  | #pragma warning(disable : 4512) // assignment operator could not be generated | ||
|  | #pragma warning(disable : 4610) // can never be instantiated - user defined constructor required | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost { namespace proto | ||
|  | { | ||
|  |     namespace detail | ||
|  |     { | ||
|  |         template<typename Expr, long Pos> | ||
|  |         struct expr_iterator | ||
|  |           : fusion::iterator_base<expr_iterator<Expr, Pos> > | ||
|  |         { | ||
|  |             typedef Expr expr_type; | ||
|  |             static const long index = Pos; | ||
|  |             typedef fusion::random_access_traversal_tag category; | ||
|  |             typedef | ||
|  |                 tag::proto_expr_iterator< | ||
|  |                     typename Expr::proto_tag | ||
|  |                   , typename Expr::proto_domain | ||
|  |                 > | ||
|  |             fusion_tag; | ||
|  | 
 | ||
|  |             explicit expr_iterator(Expr &e) | ||
|  |               : expr(e) | ||
|  |             {} | ||
|  | 
 | ||
|  |             Expr &expr; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct as_element | ||
|  |         { | ||
|  |             template<typename Sig> | ||
|  |             struct result; | ||
|  | 
 | ||
|  |             template<typename This, typename Expr> | ||
|  |             struct result<This(Expr)> | ||
|  |               : result<This(Expr const &)> | ||
|  |             {}; | ||
|  | 
 | ||
|  |             template<typename This, typename Expr> | ||
|  |             struct result<This(Expr &)> | ||
|  |               : mpl::if_c< | ||
|  |                     is_same<Tag, typename Expr::proto_tag>::value | ||
|  |                   , flat_view<Expr> | ||
|  |                   , fusion::single_view<Expr &> | ||
|  |                 > | ||
|  |             {}; | ||
|  | 
 | ||
|  |             template<typename Expr> | ||
|  |             typename result<as_element(Expr &)>::type const | ||
|  |             operator ()(Expr &e) const | ||
|  |             { | ||
|  |                 return typename result<as_element(Expr &)>::type(e); | ||
|  |             } | ||
|  | 
 | ||
|  |             template<typename Expr> | ||
|  |             typename result<as_element(Expr const &)>::type const | ||
|  |             operator ()(Expr const &e) const | ||
|  |             { | ||
|  |                 return typename result<as_element(Expr const &)>::type(e); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct flat_view | ||
|  |           : fusion::sequence_base<flat_view<Expr> > | ||
|  |         { | ||
|  |             typedef fusion::forward_traversal_tag category; | ||
|  |             typedef | ||
|  |                 tag::proto_flat_view< | ||
|  |                     typename Expr::proto_tag | ||
|  |                   , typename Expr::proto_domain | ||
|  |                 > | ||
|  |             fusion_tag; | ||
|  |             typedef | ||
|  |                 typename fusion::result_of::as_list< | ||
|  |                     typename fusion::result_of::transform< | ||
|  |                         Expr | ||
|  |                       , as_element<typename Expr::proto_tag> | ||
|  |                     >::type | ||
|  |                 >::type | ||
|  |             segments_type; | ||
|  | 
 | ||
|  |             explicit flat_view(Expr &e) | ||
|  |               : segs_(fusion::as_list(fusion::transform(e, as_element<typename Expr::proto_tag>()))) | ||
|  |             {} | ||
|  | 
 | ||
|  |             segments_type segs_; | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     namespace result_of | ||
|  |     { | ||
|  |         template<typename Expr> | ||
|  |         struct flatten | ||
|  |           : flatten<Expr const &> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         struct flatten<Expr &> | ||
|  |         { | ||
|  |             typedef detail::flat_view<Expr> type; | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     namespace functional | ||
|  |     { | ||
|  |         /// \brief A PolymorphicFunctionObject type that returns a "flattened" | ||
|  |         /// view of a Proto expression tree. | ||
|  |         /// | ||
|  |         /// A PolymorphicFunctionObject type that returns a "flattened" | ||
|  |         /// view of a Proto expression tree. For a tree with a top-most node | ||
|  |         /// tag of type \c T, the elements of the flattened sequence are | ||
|  |         /// determined by recursing into each child node with the same | ||
|  |         /// tag type and returning those nodes of different type. So for | ||
|  |         /// instance, the Proto expression tree corresponding to the | ||
|  |         /// expression <tt>a | b | c</tt> has a flattened view with elements | ||
|  |         /// [a, b, c], even though the tree is grouped as | ||
|  |         /// <tt>((a | b) | c)</tt>. | ||
|  |         struct flatten | ||
|  |         { | ||
|  |             BOOST_PROTO_CALLABLE() | ||
|  | 
 | ||
|  |             template<typename Sig> | ||
|  |             struct result; | ||
|  | 
 | ||
|  |             template<typename This, typename Expr> | ||
|  |             struct result<This(Expr)> | ||
|  |               : result<This(Expr const &)> | ||
|  |             {}; | ||
|  | 
 | ||
|  |             template<typename This, typename Expr> | ||
|  |             struct result<This(Expr &)> | ||
|  |             { | ||
|  |                 typedef proto::detail::flat_view<Expr> type; | ||
|  |             }; | ||
|  | 
 | ||
|  |             template<typename Expr> | ||
|  |             proto::detail::flat_view<Expr> const | ||
|  |             operator ()(Expr &e) const | ||
|  |             { | ||
|  |                 return proto::detail::flat_view<Expr>(e); | ||
|  |             } | ||
|  | 
 | ||
|  |             template<typename Expr> | ||
|  |             proto::detail::flat_view<Expr const> const | ||
|  |             operator ()(Expr const &e) const | ||
|  |             { | ||
|  |                 return proto::detail::flat_view<Expr const>(e); | ||
|  |             } | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     /// \brief A function that returns a "flattened" | ||
|  |     /// view of a Proto expression tree. | ||
|  |     /// | ||
|  |     /// For a tree with a top-most node | ||
|  |     /// tag of type \c T, the elements of the flattened sequence are | ||
|  |     /// determined by recursing into each child node with the same | ||
|  |     /// tag type and returning those nodes of different type. So for | ||
|  |     /// instance, the Proto expression tree corresponding to the | ||
|  |     /// expression <tt>a | b | c</tt> has a flattened view with elements | ||
|  |     /// [a, b, c], even though the tree is grouped as | ||
|  |     /// <tt>((a | b) | c)</tt>. | ||
|  |     template<typename Expr> | ||
|  |     proto::detail::flat_view<Expr> const | ||
|  |     flatten(Expr &e) | ||
|  |     { | ||
|  |         return proto::detail::flat_view<Expr>(e); | ||
|  |     } | ||
|  | 
 | ||
|  |     /// \overload | ||
|  |     /// | ||
|  |     template<typename Expr> | ||
|  |     proto::detail::flat_view<Expr const> const | ||
|  |     flatten(Expr const &e) | ||
|  |     { | ||
|  |         return proto::detail::flat_view<Expr const>(e); | ||
|  |     } | ||
|  | 
 | ||
|  |     /// INTERNAL ONLY | ||
|  |     /// | ||
|  |     template<typename Context> | ||
|  |     struct eval_fun | ||
|  |       : proto::callable | ||
|  |     { | ||
|  |         explicit eval_fun(Context &ctx) | ||
|  |           : ctx_(ctx) | ||
|  |         {} | ||
|  | 
 | ||
|  |         template<typename Sig> | ||
|  |         struct result; | ||
|  | 
 | ||
|  |         template<typename This, typename Expr> | ||
|  |         struct result<This(Expr)> | ||
|  |           : result<This(Expr const &)> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename This, typename Expr> | ||
|  |         struct result<This(Expr &)> | ||
|  |           : proto::result_of::eval<Expr, Context> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         typename proto::result_of::eval<Expr, Context>::type | ||
|  |         operator ()(Expr &e) const | ||
|  |         { | ||
|  |             return proto::eval(e, this->ctx_); | ||
|  |         } | ||
|  | 
 | ||
|  |         template<typename Expr> | ||
|  |         typename proto::result_of::eval<Expr const, Context>::type | ||
|  |         operator ()(Expr const &e) const | ||
|  |         { | ||
|  |             return proto::eval(e, this->ctx_); | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  |         Context &ctx_; | ||
|  |     }; | ||
|  | 
 | ||
|  |     /// INTERNAL ONLY | ||
|  |     /// | ||
|  |     template<typename Context> | ||
|  |     struct is_callable<eval_fun<Context> > | ||
|  |       : mpl::true_ | ||
|  |     {}; | ||
|  | }} | ||
|  | 
 | ||
|  | namespace boost { namespace fusion | ||
|  | { | ||
|  |     namespace extension | ||
|  |     { | ||
|  |         template<typename Tag> | ||
|  |         struct is_sequence_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct is_sequence_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |               : mpl::true_ | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct is_sequence_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |               : mpl::true_ | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct is_view_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct is_view_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |               : mpl::true_ | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct is_view_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |               : mpl::false_ | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct value_of_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct value_of_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template< | ||
|  |                 typename Iterator | ||
|  |               , long Arity = proto::arity_of<typename Iterator::expr_type>::value | ||
|  |             > | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::child_c< | ||
|  |                         typename Iterator::expr_type | ||
|  |                       , Iterator::index | ||
|  |                     >::value_type | ||
|  |                 type; | ||
|  |             }; | ||
|  | 
 | ||
|  |             template<typename Iterator> | ||
|  |             struct apply<Iterator, 0> | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::value< | ||
|  |                         typename Iterator::expr_type | ||
|  |                     >::value_type | ||
|  |                 type; | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct deref_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct deref_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template< | ||
|  |                 typename Iterator | ||
|  |               , long Arity = proto::arity_of<typename Iterator::expr_type>::value | ||
|  |             > | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::child_c< | ||
|  |                         typename Iterator::expr_type & | ||
|  |                       , Iterator::index | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Iterator const &iter) | ||
|  |                 { | ||
|  |                     return proto::child_c<Iterator::index>(iter.expr); | ||
|  |                 } | ||
|  |             }; | ||
|  | 
 | ||
|  |             template<typename Iterator> | ||
|  |             struct apply<Iterator, 0> | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::value< | ||
|  |                         typename Iterator::expr_type & | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Iterator const &iter) | ||
|  |                 { | ||
|  |                     return proto::value(iter.expr); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct advance_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Iterator, typename N> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     proto::detail::expr_iterator< | ||
|  |                         typename Iterator::expr_type | ||
|  |                       , Iterator::index + N::value | ||
|  |                     > | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Iterator const &iter) | ||
|  |                 { | ||
|  |                     return type(iter.expr); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct distance_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct distance_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename IteratorFrom, typename IteratorTo> | ||
|  |             struct apply | ||
|  |               : mpl::long_<IteratorTo::index - IteratorFrom::index> | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct next_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct next_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Iterator> | ||
|  |             struct apply | ||
|  |               : advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >::template apply<Iterator, mpl::long_<1> > | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct prior_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct prior_impl<proto::tag::proto_expr_iterator<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Iterator> | ||
|  |             struct apply | ||
|  |               : advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >::template apply<Iterator, mpl::long_<-1> > | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct category_of_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct category_of_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef random_access_traversal_tag type; | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct size_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct size_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |               : mpl::long_<0 == Sequence::proto_arity_c ? 1 : Sequence::proto_arity_c> | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct begin_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct begin_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef proto::detail::expr_iterator<Sequence, 0> type; | ||
|  | 
 | ||
|  |                 static type call(Sequence &seq) | ||
|  |                 { | ||
|  |                     return type(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct end_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct end_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     proto::detail::expr_iterator< | ||
|  |                         Sequence | ||
|  |                       , 0 == Sequence::proto_arity_c ? 1 : Sequence::proto_arity_c | ||
|  |                     > | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Sequence &seq) | ||
|  |                 { | ||
|  |                     return type(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct value_at_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct value_at_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template< | ||
|  |                 typename Sequence | ||
|  |               , typename Index | ||
|  |               , long Arity = proto::arity_of<Sequence>::value | ||
|  |             > | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::child_c< | ||
|  |                         Sequence | ||
|  |                       , Index::value | ||
|  |                     >::value_type | ||
|  |                 type; | ||
|  |             }; | ||
|  | 
 | ||
|  |             template<typename Sequence, typename Index> | ||
|  |             struct apply<Sequence, Index, 0> | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::value< | ||
|  |                         Sequence | ||
|  |                     >::value_type | ||
|  |                 type; | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct at_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct at_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template< | ||
|  |                 typename Sequence | ||
|  |               , typename Index | ||
|  |               , long Arity = proto::arity_of<Sequence>::value | ||
|  |             > | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::child_c< | ||
|  |                         Sequence & | ||
|  |                       , Index::value | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Sequence &seq) | ||
|  |                 { | ||
|  |                     return proto::child_c<Index::value>(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  | 
 | ||
|  |             template<typename Sequence, typename Index> | ||
|  |             struct apply<Sequence, Index, 0> | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::value< | ||
|  |                         Sequence & | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Sequence &seq) | ||
|  |                 { | ||
|  |                     return proto::value(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct convert_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct convert_impl<proto::tag::proto_expr<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::unpack_expr< | ||
|  |                         Tag | ||
|  |                       , Domain | ||
|  |                       , Sequence | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Sequence& seq) | ||
|  |                 { | ||
|  |                     return proto::unpack_expr<Tag, Domain>(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct convert_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef | ||
|  |                     typename proto::result_of::unpack_expr< | ||
|  |                         Tag | ||
|  |                       , Domain | ||
|  |                       , Sequence | ||
|  |                     >::type | ||
|  |                 type; | ||
|  | 
 | ||
|  |                 static type call(Sequence& seq) | ||
|  |                 { | ||
|  |                     return proto::unpack_expr<Tag, Domain>(seq); | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct is_segmented_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct is_segmented_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Iterator> | ||
|  |             struct apply | ||
|  |               : mpl::true_ | ||
|  |             {}; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag> | ||
|  |         struct segments_impl; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct segments_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef typename Sequence::segments_type const &type; | ||
|  |                              | ||
|  |                 static type call(Sequence &sequence) | ||
|  |                 { | ||
|  |                     return sequence.segs_; | ||
|  |                 } | ||
|  |             }; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tag, typename Domain> | ||
|  |         struct category_of_impl<proto::tag::proto_flat_view<Tag, Domain> > | ||
|  |         { | ||
|  |             template<typename Sequence> | ||
|  |             struct apply | ||
|  |             { | ||
|  |                 typedef forward_traversal_tag type; | ||
|  |             }; | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     namespace traits | ||
|  |     { | ||
|  |         template<typename Seq1, typename Seq2> | ||
|  |         struct enable_equality< | ||
|  |             Seq1 | ||
|  |           , Seq2 | ||
|  |           , typename enable_if_c< | ||
|  |                 mpl::or_< | ||
|  |                     proto::is_expr<Seq1> | ||
|  |                   , proto::is_expr<Seq2> | ||
|  |                 >::value | ||
|  |             >::type | ||
|  |         > | ||
|  |             : mpl::false_ | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename Seq1, typename Seq2> | ||
|  |         struct enable_comparison< | ||
|  |             Seq1 | ||
|  |           , Seq2 | ||
|  |           , typename enable_if_c< | ||
|  |                 mpl::or_< | ||
|  |                     proto::is_expr<Seq1> | ||
|  |                   , proto::is_expr<Seq2> | ||
|  |                 >::value | ||
|  |             >::type | ||
|  |         > | ||
|  |           : mpl::false_ | ||
|  |         {}; | ||
|  |     } | ||
|  | }} | ||
|  | 
 | ||
|  | namespace boost { namespace mpl | ||
|  | { | ||
|  |     template<typename Tag, typename Args, long Arity> | ||
|  |     struct sequence_tag< proto::expr<Tag, Args, Arity> > | ||
|  |     { | ||
|  |         typedef fusion::fusion_sequence_tag type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<typename Tag, typename Args, long Arity> | ||
|  |     struct sequence_tag< proto::basic_expr<Tag, Args, Arity> > | ||
|  |     { | ||
|  |         typedef fusion::fusion_sequence_tag type; | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #ifdef BOOST_MSVC | ||
|  | #pragma warning(pop) | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif |