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_LET_HPP Chris@16: #define PHOENIX_SCOPE_LET_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: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct let_actor : Base 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 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: let_actor(Base const& base, Vars const& vars) Chris@16: : Base(base), 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 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: locals_type locals = Chris@16: fusion::as_vector( Chris@16: fusion::transform( Chris@16: vars Chris@16: , detail::initialize_local(env))); Chris@16: Chris@16: typedef typename result::type RT; Chris@16: return RT(Base::eval( Chris@16: scoped_environment( Chris@16: env Chris@16: , env Chris@16: , locals))); Chris@16: } Chris@16: Chris@16: Vars vars; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct let_actor_gen Chris@16: { Chris@16: template Chris@16: actor > const Chris@16: operator[](actor const& base) const Chris@16: { Chris@16: return let_actor(base, vars); Chris@16: } Chris@16: Chris@16: let_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 let_gen Chris@16: { Chris@16: template Chris@16: let_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: let_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 let_actor_gen Chris@16: #include Chris@16: #undef PHOENIX_LOCAL_GEN_NAME Chris@16: }; Chris@16: Chris@16: let_gen const let = let_gen(); Chris@16: }} Chris@16: Chris@16: #endif