721 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			721 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								/// \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
							 |