Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2007 Joel de Guzman Chris@16: Copyright (c) 2004 Daniel Wallin Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef PHOENIX_SCOPE_LAMBDA_HPP Chris@16: #define PHOENIX_SCOPE_LAMBDA_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct lambda_eval : Base Chris@16: { Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename Base::template Chris@16: result >::type Chris@16: result_type; Chris@16: Chris@16: typedef typename Chris@16: detail::unwrap_local_reference::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: lambda_eval( Chris@16: Base const& base Chris@16: , OuterEnv const& outer_env Chris@16: , Locals const& locals) Chris@16: : Base(base) Chris@16: , outer_env(outer_env) Chris@16: , locals(locals) {} Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: eval(Env const& env) const Chris@16: { Chris@16: typedef typename result::type RT; Chris@16: return RT(Base::eval( Chris@16: scoped_environment( Chris@16: env, outer_env, locals))); Chris@16: } Chris@16: Chris@16: OuterEnv outer_env; Chris@16: mutable Locals locals; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lambda_actor Chris@16: { Chris@16: typedef typename Chris@16: mpl::fold< Chris@16: Vars Chris@16: , mpl::false_ Chris@16: , detail::compute_no_nullary Chris@16: >::type Chris@16: no_nullary; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename Chris@16: fusion::result_of::as_vector< Chris@16: typename fusion::result_of::transform< Chris@16: Vars Chris@16: , detail::initialize_local Chris@16: >::type Chris@16: >::type Chris@16: locals_type; Chris@16: Chris@16: typedef actor > type; Chris@16: }; Chris@16: Chris@16: lambda_actor(Base const& f, Vars const& vars) Chris@16: : f(f), vars(vars) {} Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: eval(Env const& env) const Chris@16: { Chris@16: typedef typename result::type result_type; Chris@16: Chris@16: return result_type( Chris@16: f, env, fusion::as_vector( Chris@16: fusion::transform( Chris@16: vars Chris@16: , detail::initialize_local(env) Chris@16: ))); Chris@16: } Chris@16: Chris@16: Base f; Chris@16: Vars vars; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct lambda_actor_gen Chris@16: { Chris@16: template Chris@16: actor > const Chris@16: operator[](actor const& f) const Chris@16: { Chris@16: return lambda_actor(f, vars); Chris@16: } Chris@16: Chris@16: lambda_actor_gen(Vars const& vars) Chris@16: : vars(vars) {} Chris@16: Chris@16: Vars vars; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct local_variable; // forward Chris@16: struct assign_eval; // forward Chris@16: Chris@16: struct lambda_gen Chris@16: : lambda_actor_gen< Chris@16: fusion::vector<> Chris@16: , detail::map_local_index_to_tuple<> > Chris@16: { Chris@16: typedef Chris@16: lambda_actor_gen< Chris@16: fusion::vector<> Chris@16: , detail::map_local_index_to_tuple<> > Chris@16: base_type; Chris@16: Chris@16: lambda_gen() Chris@16: : base_type(fusion::vector<>()) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: lambda_actor_gen< Chris@16: fusion::vector Chris@16: , detail::map_local_index_to_tuple Chris@16: > Chris@16: operator()( Chris@16: actor, V0> > > const& a0 Chris@16: ) const Chris@16: { Chris@16: return fusion::vector(fusion::at_c<1>(a0)); Chris@16: } Chris@16: Chris@16: template Chris@16: lambda_actor_gen< Chris@16: fusion::vector Chris@16: , detail::map_local_index_to_tuple Chris@16: > Chris@16: operator()( Chris@16: actor, V0> > > const& a0 Chris@16: , actor, V1> > > const& a1 Chris@16: ) const Chris@16: { Chris@16: return fusion::vector(fusion::at_c<1>(a0), fusion::at_c<1>(a1)); Chris@16: } Chris@16: Chris@16: // Bring in the rest... Chris@16: #define PHOENIX_LOCAL_GEN_NAME lambda_actor_gen Chris@16: #include Chris@16: #undef PHOENIX_LOCAL_GEN_NAME Chris@16: }; Chris@16: Chris@16: lambda_gen const lambda = lambda_gen(); Chris@16: }} Chris@16: Chris@16: #endif