/*============================================================================= Copyright (c) 2001-2007 Joel de Guzman Copyright (c) 2004 Daniel Wallin 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 PHOENIX_SCOPE_LET_HPP #define PHOENIX_SCOPE_LET_HPP #include #include #include #include #include #include #include #include #include #include namespace boost { namespace phoenix { template struct let_actor : Base { typedef typename mpl::fold< Vars , mpl::false_ , detail::compute_no_nullary >::type no_nullary; template struct result { typedef typename fusion::result_of::as_vector< typename fusion::result_of::transform< Vars , detail::initialize_local >::type >::type locals_type; typedef typename Base::template result >::type result_type; typedef typename detail::unwrap_local_reference::type type; }; let_actor(Base const& base, Vars const& vars) : Base(base), vars(vars) {} template typename result::type eval(Env const& env) const { typedef typename fusion::result_of::as_vector< typename fusion::result_of::transform< Vars , detail::initialize_local >::type >::type locals_type; locals_type locals = fusion::as_vector( fusion::transform( vars , detail::initialize_local(env))); typedef typename result::type RT; return RT(Base::eval( scoped_environment( env , env , locals))); } Vars vars; }; template struct let_actor_gen { template actor > const operator[](actor const& base) const { return let_actor(base, vars); } let_actor_gen(Vars const& vars) : vars(vars) {} Vars vars; }; template struct local_variable; // forward struct assign_eval; // forward struct let_gen { template let_actor_gen< fusion::vector , detail::map_local_index_to_tuple > operator()( actor, V0> > > const& a0 ) const { return fusion::vector(fusion::at_c<1>(a0)); } template let_actor_gen< fusion::vector , detail::map_local_index_to_tuple > operator()( actor, V0> > > const& a0 , actor, V1> > > const& a1 ) const { return fusion::vector(fusion::at_c<1>(a0), fusion::at_c<1>(a1)); } // Bring in the rest... #define PHOENIX_LOCAL_GEN_NAME let_actor_gen #include #undef PHOENIX_LOCAL_GEN_NAME }; let_gen const let = let_gen(); }} #endif