Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2011 Joel de Guzman Chris@16: Copyright (c) 2011 Thomas Heller 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 BOOST_PHOENIX_SCOPE_THIS_HPP Chris@16: #define BOOST_PHOENIX_SCOPE_THIS_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: BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG( Chris@16: (boost)(phoenix)(this_) Chris@16: , (meta_grammar)(meta_grammar) Chris@16: , BOOST_PHOENIX_LIMIT Chris@16: ) Chris@16: Chris@16: namespace boost { namespace phoenix { Chris@16: namespace detail Chris@16: { Chris@16: /* Chris@16: struct infinite_recursion_detected {}; Chris@16: Chris@16: struct last_non_this_actor Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::nary_expr< Chris@16: proto::_ Chris@16: , proto::_ Chris@16: , proto::_ Chris@16: > Chris@16: , proto::_child_c<1> Chris@16: > Chris@16: , proto::when< Chris@16: proto::nary_expr< Chris@16: proto::_ Chris@16: , proto::_ Chris@16: , proto::_ Chris@16: , proto::_ Chris@16: > Chris@16: , proto::_child_c<2> Chris@16: > Chris@16: > Chris@16: {}; Chris@16: */ Chris@16: } Chris@16: struct this_eval Chris@16: { Chris@16: BOOST_PROTO_CALLABLE() Chris@16: Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename proto::detail::uncvref< Chris@16: typename result_of::env< Chris@16: Context Chris@16: >::type Chris@16: >::type Chris@16: outer_env_type; Chris@16: Chris@16: typedef Chris@16: typename remove_pointer< Chris@16: typename remove_reference< Chris@16: typename fusion::result_of::at_c< Chris@16: outer_env_type Chris@16: , 0 Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: actor_type; Chris@16: Chris@16: typedef Chris@16: typename result_of::eval< Chris@16: A0 const & Chris@16: , Context const & Chris@16: >::type Chris@16: a0_type; Chris@16: Chris@16: typedef Chris@16: vector2 Chris@16: inner_env_type; Chris@16: Chris@16: typedef Chris@16: scoped_environment< Chris@16: inner_env_type Chris@16: , outer_env_type Chris@16: , vector0<> Chris@16: , detail::map_local_index_to_tuple<> Chris@16: > Chris@16: env_type; Chris@16: Chris@16: typedef Chris@16: typename result_of::eval< Chris@16: actor_type const & Chris@16: , typename result_of::context< Chris@16: inner_env_type Chris@16: , typename result_of::actions< Chris@16: Context Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: operator()(A0 const & a0, Context const & ctx) const Chris@16: { Chris@16: Chris@16: //std::cout << typeid(checker).name() << "\n"; Chris@16: //std::cout << typeid(checker).name() << "\n"; Chris@16: typedef Chris@16: typename proto::detail::uncvref< Chris@16: typename result_of::env< Chris@16: Context Chris@16: >::type Chris@16: >::type Chris@16: outer_env_type; Chris@16: Chris@16: typedef Chris@16: typename remove_pointer< Chris@16: typename remove_reference< Chris@16: typename fusion::result_of::at_c< Chris@16: outer_env_type Chris@16: , 0 Chris@16: >::type Chris@16: >::type Chris@16: >::type Chris@16: actor_type; Chris@16: Chris@16: typedef Chris@16: typename result_of::eval< Chris@16: A0 const & Chris@16: , Context const & Chris@16: >::type Chris@16: a0_type; Chris@16: Chris@16: typedef Chris@16: vector2 Chris@16: inner_env_type; Chris@16: Chris@16: typedef Chris@16: scoped_environment< Chris@16: inner_env_type Chris@16: , outer_env_type Chris@16: , vector0<> Chris@16: , detail::map_local_index_to_tuple<> Chris@16: > Chris@16: env_type; Chris@16: Chris@16: inner_env_type inner_env = {fusion::at_c<0>(phoenix::env(ctx)), phoenix::eval(a0, ctx)}; Chris@16: vector0<> locals; Chris@16: env_type env(inner_env, phoenix::env(ctx), locals); Chris@16: Chris@16: return phoenix::eval(*fusion::at_c<0>(phoenix::env(ctx)), phoenix::context(inner_env, phoenix::actions(ctx))); Chris@16: //return (*fusion::at_c<0>(phoenix::env(ctx)))(eval(a0, ctx)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct default_actions::when Chris@16: : call Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_nullary::when Chris@16: : proto::make Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename expression::this_::type const Chris@16: this_(A0 const & a0) Chris@16: { Chris@16: return expression::this_::make(a0); Chris@16: } Chris@16: Chris@16: }} Chris@16: Chris@16: #endif