470 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			470 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*==============================================================================
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2005-2010 Joel de Guzman
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2010-2011 Thomas Heller
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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_PHOENIX_CORE_ENVIRONMENT_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_PHOENIX_CORE_ENVIRONMENT_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/phoenix/core/limits.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/sequence/intrinsic/at.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/fusion/support/is_sequence.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/phoenix/support/vector.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/proto/transform/impl.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/utility/enable_if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/utility/result_of.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <typeinfo>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace phoenix 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct unused {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace result_of
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								        struct context
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef vector2<Env, Actions> type;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								        struct make_context
							 | 
						||
| 
								 | 
							
								            : context<Env, Actions>
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename Context>
							 | 
						||
| 
								 | 
							
								        struct env
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                typename fusion::result_of::at_c<
							 | 
						||
| 
								 | 
							
								                    typename boost::remove_reference<Context>::type
							 | 
						||
| 
								 | 
							
								                  , 0
							 | 
						||
| 
								 | 
							
								                >::type
							 | 
						||
| 
								 | 
							
								                type;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        template <typename Context>
							 | 
						||
| 
								 | 
							
								        struct actions
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                typename fusion::result_of::at_c<
							 | 
						||
| 
								 | 
							
								                    typename boost::remove_reference<Context>::type
							 | 
						||
| 
								 | 
							
								                  , 1
							 | 
						||
| 
								 | 
							
								                >::type
							 | 
						||
| 
								 | 
							
								                type;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace functional
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        struct context
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_PROTO_CALLABLE()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Sig>
							 | 
						||
| 
								 | 
							
								            struct result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            struct result<This(Env, Actions)>
							 | 
						||
| 
								 | 
							
								                : result<This(Env const &, Actions const &)>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            struct result<This(Env &, Actions)>
							 | 
						||
| 
								 | 
							
								                : result<This(Env &, Actions const &)>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            struct result<This(Env, Actions &)>
							 | 
						||
| 
								 | 
							
								                : result<This(Env const &, Actions &)>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            struct result<This(Env &, Actions &)>
							 | 
						||
| 
								 | 
							
								                : result_of::context<Env &, Actions &>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            typename result_of::context<Env &, Actions &>::type
							 | 
						||
| 
								 | 
							
								            operator()(Env & env, Actions & actions) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                vector2<Env &, Actions &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								                return e;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            typename result_of::context<Env const &, Actions &>::type
							 | 
						||
| 
								 | 
							
								            operator()(Env const & env, Actions & actions) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                vector2<Env const &, Actions &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								                return e;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            typename result_of::context<Env &, Actions const &>::type
							 | 
						||
| 
								 | 
							
								            operator()(Env & env, Actions const & actions) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                vector2<Env &, Actions const &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								                return e;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								            typename result_of::context<Env const &, Actions const &>::type
							 | 
						||
| 
								 | 
							
								            operator()(Env const & env, Actions const & actions) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                vector2<Env const&, Actions const &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								                return e;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        struct make_context
							 | 
						||
| 
								 | 
							
								            : context
							 | 
						||
| 
								 | 
							
								        {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        struct env
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_PROTO_CALLABLE()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Sig>
							 | 
						||
| 
								 | 
							
								            struct result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Context>
							 | 
						||
| 
								 | 
							
								            struct result<This(Context)>
							 | 
						||
| 
								 | 
							
								                : result<This(Context const &)>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Context>
							 | 
						||
| 
								 | 
							
								            struct result<This(Context &)>
							 | 
						||
| 
								 | 
							
								                : result_of::env<Context>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Context>
							 | 
						||
| 
								 | 
							
								            typename result_of::env<Context const>::type
							 | 
						||
| 
								 | 
							
								            operator()(Context const & ctx) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<0>(ctx);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Context>
							 | 
						||
| 
								 | 
							
								            typename result_of::env<Context>::type
							 | 
						||
| 
								 | 
							
								            operator()(Context & ctx) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<0>(ctx);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        struct actions
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_PROTO_CALLABLE()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Sig>
							 | 
						||
| 
								 | 
							
								            struct result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Context>
							 | 
						||
| 
								 | 
							
								            struct result<This(Context)>
							 | 
						||
| 
								 | 
							
								                : result<This(Context const &)>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename This, typename Context>
							 | 
						||
| 
								 | 
							
								            struct result<This(Context &)>
							 | 
						||
| 
								 | 
							
								                : result_of::actions<Context>
							 | 
						||
| 
								 | 
							
								            {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Context>
							 | 
						||
| 
								 | 
							
								            typename result_of::actions<Context const>::type
							 | 
						||
| 
								 | 
							
								            operator()(Context const & ctx) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<1>(ctx);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            template <typename Context>
							 | 
						||
| 
								 | 
							
								            typename result_of::actions<Context>::type
							 | 
						||
| 
								 | 
							
								            operator()(Context & ctx) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<1>(ctx);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct _context
							 | 
						||
| 
								 | 
							
								        : proto::transform<_context>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Expr, typename State, typename Data>
							 | 
						||
| 
								 | 
							
								        struct impl
							 | 
						||
| 
								 | 
							
								            : proto::transform_impl<Expr, State, Data>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef vector2<State, Data> result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()(
							 | 
						||
| 
								 | 
							
								                typename impl::expr_param
							 | 
						||
| 
								 | 
							
								              , typename impl::state_param s
							 | 
						||
| 
								 | 
							
								              , typename impl::data_param d
							 | 
						||
| 
								 | 
							
								            ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                vector2<State, Data> e = {s, d};
							 | 
						||
| 
								 | 
							
								                return e;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env const &, Actions const&>::type const
							 | 
						||
| 
								 | 
							
								    context(Env const& env, Actions const& actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        vector2<Env const&, Actions const &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								        return e;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env const &, Actions const&>::type const
							 | 
						||
| 
								 | 
							
								    make_context(Env const& env, Actions const& actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return context(env, actions);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env &, Actions const&>::type const
							 | 
						||
| 
								 | 
							
								    context(Env & env, Actions const& actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        vector2<Env &, Actions const &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								        return e;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env &, Actions const&>::type const
							 | 
						||
| 
								 | 
							
								    make_context(Env & env, Actions const& actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return context(env, actions);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env const &, Actions &>::type const
							 | 
						||
| 
								 | 
							
								    context(Env const& env, Actions & actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        vector2<Env const&, Actions &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								        return e;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env const &, Actions &>::type const
							 | 
						||
| 
								 | 
							
								    make_context(Env const& env, Actions & actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return context(env, actions);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env &, Actions &>::type const
							 | 
						||
| 
								 | 
							
								    context(Env & env, Actions & actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        vector2<Env &, Actions &> e = {env, actions};
							 | 
						||
| 
								 | 
							
								        return e;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    template <typename Env, typename Actions>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename result_of::context<Env &, Actions &>::type const
							 | 
						||
| 
								 | 
							
								    make_context(Env & env, Actions & actions)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return context(env, actions);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct _env
							 | 
						||
| 
								 | 
							
								        : proto::transform<_env>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Expr, typename State, typename Data>
							 | 
						||
| 
								 | 
							
								        struct impl
							 | 
						||
| 
								 | 
							
								            : proto::transform_impl<Expr, State, Data>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef State result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()(
							 | 
						||
| 
								 | 
							
								                typename impl::expr_param
							 | 
						||
| 
								 | 
							
								              , typename impl::state_param s
							 | 
						||
| 
								 | 
							
								              , typename impl::data_param
							 | 
						||
| 
								 | 
							
								            ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return s;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Expr, typename State>
							 | 
						||
| 
								 | 
							
								    struct _env::impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								        : proto::transform_impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                typename fusion::result_of::at_c<
							 | 
						||
| 
								 | 
							
								                    typename boost::remove_reference<State>::type
							 | 
						||
| 
								 | 
							
								                  , 0
							 | 
						||
| 
								 | 
							
								                >::type
							 | 
						||
| 
								 | 
							
								                result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()(
							 | 
						||
| 
								 | 
							
								                typename impl::expr_param
							 | 
						||
| 
								 | 
							
								              , typename impl::state_param s
							 | 
						||
| 
								 | 
							
								              , typename impl::data_param
							 | 
						||
| 
								 | 
							
								            ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<0>(s);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Expr, typename State>
							 | 
						||
| 
								 | 
							
								    struct _env::impl<Expr, State, unused>
							 | 
						||
| 
								 | 
							
								        : _env::impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								    {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Context>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename fusion::result_of::at_c<Context, 0>::type
							 | 
						||
| 
								 | 
							
								    env(Context & ctx)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return fusion::at_c<0>(ctx);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Context>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename fusion::result_of::at_c<Context const, 0>::type
							 | 
						||
| 
								 | 
							
								    env(Context const & ctx)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return fusion::at_c<0>(ctx);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct _actions
							 | 
						||
| 
								 | 
							
								        : proto::transform<_actions>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <typename Expr, typename State, typename Data>
							 | 
						||
| 
								 | 
							
								        struct impl
							 | 
						||
| 
								 | 
							
								            : proto::transform_impl<Expr, State, Data>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef Data result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()(
							 | 
						||
| 
								 | 
							
								                typename impl::expr_param
							 | 
						||
| 
								 | 
							
								              , typename impl::state_param
							 | 
						||
| 
								 | 
							
								              , typename impl::data_param d
							 | 
						||
| 
								 | 
							
								            ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return d;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Expr, typename State>
							 | 
						||
| 
								 | 
							
								    struct _actions::impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								        : proto::transform_impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								            typedef
							 | 
						||
| 
								 | 
							
								                typename fusion::result_of::at_c<
							 | 
						||
| 
								 | 
							
								                    typename boost::remove_reference<State>::type
							 | 
						||
| 
								 | 
							
								                  , 1
							 | 
						||
| 
								 | 
							
								                >::type
							 | 
						||
| 
								 | 
							
								                result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()(
							 | 
						||
| 
								 | 
							
								                typename impl::expr_param
							 | 
						||
| 
								 | 
							
								              , typename impl::state_param s
							 | 
						||
| 
								 | 
							
								              , typename impl::data_param
							 | 
						||
| 
								 | 
							
								            ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return fusion::at_c<1>(s);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Expr, typename State>
							 | 
						||
| 
								 | 
							
								    struct _actions::impl<Expr, State, unused>
							 | 
						||
| 
								 | 
							
								        : _actions::impl<Expr, State, proto::empty_env>
							 | 
						||
| 
								 | 
							
								    {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Context>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename fusion::result_of::at_c<Context, 1>::type
							 | 
						||
| 
								 | 
							
								    actions(Context & ctx)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return fusion::at_c<1>(ctx);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Context>
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    typename fusion::result_of::at_c<Context const, 1>::type
							 | 
						||
| 
								 | 
							
								    actions(Context const & ctx)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return fusion::at_c<1>(ctx);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace result_of
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template <
							 | 
						||
| 
								 | 
							
								            BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
							 | 
						||
| 
								 | 
							
								                BOOST_PHOENIX_LIMIT
							 | 
						||
| 
								 | 
							
								              , typename A
							 | 
						||
| 
								 | 
							
								              , mpl::void_
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								          , typename Dummy = void
							 | 
						||
| 
								 | 
							
								        >
							 | 
						||
| 
								 | 
							
								        struct make_env;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								    #define M0(Z, N, D)                                                         \
							 | 
						||
| 
								 | 
							
								        template <BOOST_PHOENIX_typename_A(N)>                                  \
							 | 
						||
| 
								 | 
							
								        struct make_env<BOOST_PHOENIX_A(N)>                                     \
							 | 
						||
| 
								 | 
							
								        {                                                                       \
							 | 
						||
| 
								 | 
							
								            typedef BOOST_PP_CAT(vector, N)<BOOST_PHOENIX_A(N)> type;           \
							 | 
						||
| 
								 | 
							
								        };                                                                      \
							 | 
						||
| 
								 | 
							
								    /**/
							 | 
						||
| 
								 | 
							
								        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PHOENIX_LIMIT, M0, _)
							 | 
						||
| 
								 | 
							
								    #undef M0
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    inline
							 | 
						||
| 
								 | 
							
								    result_of::make_env<>::type
							 | 
						||
| 
								 | 
							
								    make_env()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return result_of::make_env<>::type();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#define M0(Z, N, D)                                                             \
							 | 
						||
| 
								 | 
							
								    template <BOOST_PHOENIX_typename_A(N)>                                      \
							 | 
						||
| 
								 | 
							
								    inline                                                                      \
							 | 
						||
| 
								 | 
							
								    typename result_of::make_env<BOOST_PHOENIX_A_ref(N)>::type                  \
							 | 
						||
| 
								 | 
							
								    make_env(BOOST_PHOENIX_A_ref_a(N))                                          \
							 | 
						||
| 
								 | 
							
								    {                                                                           \
							 | 
						||
| 
								 | 
							
								        typename result_of::make_env<BOOST_PHOENIX_A_ref(N)>::type              \
							 | 
						||
| 
								 | 
							
								            env =                                                               \
							 | 
						||
| 
								 | 
							
								            {                                                                   \
							 | 
						||
| 
								 | 
							
								                BOOST_PHOENIX_a(N)                                              \
							 | 
						||
| 
								 | 
							
								            };                                                                  \
							 | 
						||
| 
								 | 
							
								        return env;                                                             \
							 | 
						||
| 
								 | 
							
								    }                                                                           \
							 | 
						||
| 
								 | 
							
								    template <BOOST_PHOENIX_typename_A(N)>                                      \
							 | 
						||
| 
								 | 
							
								    inline                                                                      \
							 | 
						||
| 
								 | 
							
								    typename result_of::make_env<BOOST_PHOENIX_A_const_ref(N)>::type            \
							 | 
						||
| 
								 | 
							
								    make_env(BOOST_PHOENIX_A_const_ref_a(N))                                    \
							 | 
						||
| 
								 | 
							
								    {                                                                           \
							 | 
						||
| 
								 | 
							
								        typename result_of::make_env<BOOST_PHOENIX_A_const_ref(N)>::type        \
							 | 
						||
| 
								 | 
							
								            env =                                                               \
							 | 
						||
| 
								 | 
							
								            {                                                                   \
							 | 
						||
| 
								 | 
							
								                BOOST_PHOENIX_a(N)                                              \
							 | 
						||
| 
								 | 
							
								            };                                                                  \
							 | 
						||
| 
								 | 
							
								        return env;                                                             \
							 | 
						||
| 
								 | 
							
								    }                                                                           \
							 | 
						||
| 
								 | 
							
								    /**/
							 | 
						||
| 
								 | 
							
								        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PHOENIX_LIMIT, M0, _)
							 | 
						||
| 
								 | 
							
								    #undef M0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename T, typename Enable = void>
							 | 
						||
| 
								 | 
							
								    struct is_environment : fusion::traits::is_sequence<T> {};
							 | 
						||
| 
								 | 
							
								}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |