381 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*==============================================================================
 | |
|     Copyright (c) 2001-2010 Joel de Guzman
 | |
|     Copyright (c) 2004 Daniel Wallin
 | |
|     Copyright (c) 2010 Thomas Heller
 | |
|     Copyright (c) 2016 Kohei Takahashi
 | |
| 
 | |
|     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_SCOPE_LAMBDA_HPP
 | |
| #define BOOST_PHOENIX_SCOPE_LAMBDA_HPP
 | |
| 
 | |
| #include <boost/phoenix/core/limits.hpp>
 | |
| #include <boost/fusion/include/transform.hpp>
 | |
| #include <boost/fusion/include/as_vector.hpp>
 | |
| #include <boost/mpl/int.hpp>
 | |
| #include <boost/phoenix/core/call.hpp>
 | |
| #include <boost/phoenix/core/expression.hpp>
 | |
| #include <boost/phoenix/core/meta_grammar.hpp>
 | |
| #include <boost/phoenix/scope/local_variable.hpp>
 | |
| #include <boost/phoenix/scope/scoped_environment.hpp>
 | |
| 
 | |
| BOOST_PHOENIX_DEFINE_EXPRESSION(
 | |
|     (boost)(phoenix)(lambda_actor)
 | |
|   , (proto::terminal<proto::_>) // Locals
 | |
|     (proto::terminal<proto::_>) // Map
 | |
|     (meta_grammar)              // Lambda
 | |
| )
 | |
| 
 | |
| BOOST_PHOENIX_DEFINE_EXPRESSION(
 | |
|     (boost)(phoenix)(lambda)
 | |
|   , (proto::terminal<proto::_>) // OuterEnv 
 | |
|     (proto::terminal<proto::_>) // Locals
 | |
|     (proto::terminal<proto::_>) // Map
 | |
|     (meta_grammar)              // Lambda
 | |
| )
 | |
| 
 | |
| namespace boost { namespace phoenix
 | |
| {
 | |
|     struct lambda_eval
 | |
|     {
 | |
|         BOOST_PROTO_CALLABLE()
 | |
| 
 | |
|         template <typename Sig>
 | |
|         struct result;
 | |
| 
 | |
|         template <
 | |
|             typename This
 | |
|           , typename OuterEnv
 | |
|           , typename Locals
 | |
|           , typename Map
 | |
|           , typename Lambda
 | |
|           , typename Context
 | |
|         >
 | |
|         struct result<This(OuterEnv, Locals, Map, Lambda, Context)>
 | |
|         {
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         OuterEnv
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 outer_env_type;
 | |
| 
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         Locals
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 locals_type;
 | |
| 
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         Map
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 map_type;
 | |
|             
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::env<Context>::type
 | |
|                 >::type
 | |
|                 env_type;
 | |
| 
 | |
|                     typedef
 | |
|                             typename result_of::eval<
 | |
|                                 Lambda
 | |
|                                      , typename result_of::context<
 | |
|                                        scoped_environment<
 | |
|                                               env_type
 | |
|                                             , outer_env_type
 | |
|                                             , locals_type
 | |
|                                             , map_type
 | |
|                                             >
 | |
|                           , typename result_of::actions<
 | |
|                                 Context
 | |
|                                             >::type
 | |
|                                        >::type
 | |
|                                     >::type
 | |
|                              type;
 | |
|         };
 | |
| 
 | |
|         template <typename OuterEnv, typename Locals, typename Map, typename Lambda, typename Context>
 | |
|         typename result<lambda_eval(OuterEnv const &, Locals const &, Map const &, Lambda const &, Context const &)>::type
 | |
|         operator()(OuterEnv const & outer_env, Locals const & locals, Map const &, Lambda const & lambda, Context const & ctx) const
 | |
|         {
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         OuterEnv
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 outer_env_type;
 | |
| 
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         Locals
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 locals_type;
 | |
| 
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<
 | |
|                         Map
 | |
|                     >::type
 | |
|                 >::type
 | |
|                 map_type;
 | |
|             
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::env<Context>::type
 | |
|                 >::type
 | |
|                 env_type;
 | |
|             
 | |
|                 scoped_environment<
 | |
|                 env_type
 | |
|               , outer_env_type
 | |
|               , locals_type
 | |
|               , map_type
 | |
|             >
 | |
|             env(phoenix::env(ctx), proto::value(outer_env), proto::value(locals));
 | |
| 
 | |
|             return eval(lambda, phoenix::context(env, phoenix::actions(ctx)));
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     template <typename Dummy>
 | |
|     struct default_actions::when<rule::lambda, Dummy>
 | |
|         : call<lambda_eval, Dummy>
 | |
|     {};
 | |
| 
 | |
|     template <typename Dummy>
 | |
|     struct is_nullary::when<rule::lambda, Dummy>
 | |
|         : proto::call<
 | |
|             evaluator(
 | |
|                 proto::_child_c<3>
 | |
|               , proto::call<
 | |
|                     functional::context(
 | |
|                         proto::make<
 | |
|                             mpl::true_()
 | |
|                         >
 | |
|                       , proto::make<
 | |
|                             detail::scope_is_nullary_actions()
 | |
|                         >
 | |
|                     )
 | |
|                 >
 | |
|               , proto::make<
 | |
|                     proto::empty_env()
 | |
|                 >
 | |
|             )
 | |
|         >
 | |
|     {};
 | |
| 
 | |
|     template <typename Dummy>
 | |
|     struct is_nullary::when<rule::lambda_actor, Dummy>
 | |
|         : proto::or_<
 | |
|             proto::when<
 | |
|                 expression::lambda_actor<
 | |
|                     proto::terminal<vector0<> >
 | |
|                   , proto::terminal<proto::_>
 | |
|                   , meta_grammar
 | |
|                 >
 | |
|               , mpl::true_()
 | |
|             >
 | |
|           , proto::when<
 | |
|                 expression::lambda_actor<
 | |
|                     proto::terminal<proto::_>
 | |
|                   , proto::terminal<proto::_>
 | |
|                   , meta_grammar
 | |
|                 >
 | |
|               , proto::fold<
 | |
|                     proto::call<proto::_value(proto::_child_c<0>)>
 | |
|                   , proto::make<mpl::true_()>
 | |
|                   , proto::make<
 | |
|                         mpl::and_<
 | |
|                             proto::_state
 | |
|                           , proto::call<
 | |
|                                 evaluator(
 | |
|                                     proto::_
 | |
|                                   , _context
 | |
|                                   , proto::make<proto::empty_env()>
 | |
|                                 )
 | |
|                             >
 | |
|                         >()
 | |
|                     >
 | |
|                 >
 | |
|             >
 | |
|         >
 | |
|     {};
 | |
| 
 | |
|     struct lambda_actor_eval
 | |
|     {
 | |
|         template <typename Sig>
 | |
|         struct result;
 | |
| 
 | |
|         template <typename This, typename Vars, typename Map, typename Lambda, typename Context>
 | |
|         struct result<This(Vars, Map, Lambda, Context)>
 | |
|         {
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::env<Context>::type
 | |
|                 >::type
 | |
|                 env_type;
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::actions<Context>::type
 | |
|                 >::type
 | |
|                 actions_type;
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<Vars>::type
 | |
|                      >::type
 | |
|                      vars_type;
 | |
|             
 | |
|             typedef typename
 | |
|                 detail::result_of::initialize_locals<
 | |
|                     vars_type
 | |
|                   , Context
 | |
|                 >::type
 | |
|             locals_type;
 | |
| 
 | |
|             typedef
 | |
|                 typename expression::lambda<
 | |
|                     env_type
 | |
|                   , locals_type
 | |
|                   , Map
 | |
|                   , Lambda
 | |
|                 >::type const
 | |
|                 type;
 | |
|         };
 | |
| 
 | |
|         template <
 | |
|             typename Vars
 | |
|           , typename Map
 | |
|           , typename Lambda
 | |
|           , typename Context
 | |
|         >
 | |
|         typename result<
 | |
|             lambda_actor_eval(Vars const&, Map const &, Lambda const&, Context const &)
 | |
|         >::type const
 | |
|         operator()(Vars const& vars, Map const& map, Lambda const& lambda, Context const & ctx) const
 | |
|         {
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::env<Context>::type
 | |
|                 >::type
 | |
|                 env_type;
 | |
|             /*typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename result_of::actions<Context>::type
 | |
|                 >::type
 | |
|                 actions_type;*/
 | |
|             typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<Vars>::type
 | |
|                      >::type
 | |
|                      vars_type;
 | |
|             /*typedef
 | |
|                 typename proto::detail::uncvref<
 | |
|                     typename proto::result_of::value<Map>::type
 | |
|                      >::type
 | |
|                      map_type;*/
 | |
| 
 | |
|             typedef typename
 | |
|                 detail::result_of::initialize_locals<
 | |
|                     vars_type
 | |
|                   , Context
 | |
|                 >::type
 | |
|             locals_type;
 | |
| 
 | |
|             locals_type locals = initialize_locals(proto::value(vars), ctx);
 | |
| 
 | |
|             return
 | |
|                 expression::
 | |
|                     lambda<env_type, locals_type, Map, Lambda>::
 | |
|                         make(phoenix::env(ctx), locals, map, lambda);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     template <typename Dummy>
 | |
|     struct default_actions::when<rule::lambda_actor, Dummy>
 | |
|         : call<lambda_actor_eval, Dummy>
 | |
|     {};
 | |
|     
 | |
|     template <typename Locals = vector0<>,
 | |
|               typename Map = detail::map_local_index_to_tuple<>,
 | |
|               typename Dummy = void>
 | |
|     struct lambda_actor_gen;
 | |
| 
 | |
|     template <>
 | |
|     struct lambda_actor_gen<vector0<>, detail::map_local_index_to_tuple<>, void>
 | |
|     {
 | |
|         template <typename Expr>
 | |
|         typename expression::lambda_actor<vector0<>, detail::map_local_index_to_tuple<>, Expr>::type const
 | |
|         operator[](Expr const & expr) const
 | |
|         {
 | |
|             typedef vector0<> locals_type;
 | |
|             typedef detail::map_local_index_to_tuple<> map_type;
 | |
|             return expression::lambda_actor<locals_type, map_type, Expr>::make(locals_type(), map_type(), expr);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     template <typename Locals, typename Map>
 | |
|     struct lambda_actor_gen<Locals, Map>
 | |
|     {
 | |
|         lambda_actor_gen(Locals const & locals_)
 | |
|             : locals(locals_)
 | |
|         {}
 | |
| 
 | |
|         lambda_actor_gen(lambda_actor_gen const & o)
 | |
|             : locals(o.locals)
 | |
|         {};
 | |
| 
 | |
|         template <typename Expr>
 | |
|         typename expression::lambda_actor<
 | |
|             Locals
 | |
|           , Map
 | |
|           , Expr
 | |
|         >::type const
 | |
|         operator[](Expr const & expr) const
 | |
|         {
 | |
|             return expression::lambda_actor<Locals, Map, Expr>::make(locals, Map(), expr);
 | |
|         }
 | |
| 
 | |
|         Locals locals;
 | |
|     };
 | |
| 
 | |
|     struct lambda_local_gen
 | |
|         : lambda_actor_gen<>
 | |
|     {
 | |
| #if defined(BOOST_PHOENIX_NO_VARIADIC_SCOPE)
 | |
|         lambda_actor_gen<> const
 | |
|         operator()() const
 | |
|         {
 | |
|             return lambda_actor_gen<>();
 | |
|         }
 | |
| 
 | |
|         #include <boost/phoenix/scope/detail/cpp03/lambda.hpp>
 | |
| #else
 | |
| #define BOOST_PHOENIX_SCOPE_ACTOR_GEN_NAME lambda_actor_gen
 | |
| #define BOOST_PHOENIX_SCOPE_ACTOR_GEN_FUNCTION operator()
 | |
| #define BOOST_PHOENIX_SCOPE_ACTOR_GEN_CONST const
 | |
|         #include <boost/phoenix/scope/detail/local_gen.hpp>
 | |
| #undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_NAME
 | |
| #undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_FUNCTION
 | |
| #undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_CONST
 | |
| #endif
 | |
|     };
 | |
| 
 | |
|     typedef lambda_local_gen lambda_type;
 | |
|     lambda_local_gen const lambda = lambda_local_gen();
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif
 | 
