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@101: typedef Chris@101: typename proto::detail::uncvref< Chris@101: typename result_of::env< Chris@101: Context Chris@101: >::type Chris@101: >::type Chris@101: outer_env_type; Chris@16: Chris@101: typedef Chris@101: typename remove_pointer< Chris@101: typename remove_reference< Chris@101: typename fusion::result_of::at_c< Chris@101: outer_env_type Chris@101: , 0 Chris@101: >::type Chris@101: >::type Chris@101: >::type Chris@101: actor_type; Chris@16: Chris@101: typedef Chris@101: typename result_of::eval< Chris@101: A0 const & Chris@101: , Context const & Chris@101: >::type Chris@101: a0_type; Chris@101: Chris@101: typedef Chris@101: vector2 Chris@101: inner_env_type; Chris@101: Chris@101: typedef Chris@101: scoped_environment< Chris@101: inner_env_type Chris@101: , outer_env_type Chris@101: , vector0<> Chris@101: , detail::map_local_index_to_tuple<> Chris@101: > Chris@101: env_type; Chris@101: Chris@101: typedef Chris@101: typename result_of::eval< Chris@101: actor_type const & Chris@101: , typename result_of::context< Chris@101: inner_env_type Chris@101: , typename result_of::actions< Chris@101: Context Chris@101: >::type Chris@101: >::type Chris@101: >::type Chris@101: 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@101: typedef Chris@101: typename proto::detail::uncvref< Chris@101: typename result_of::env< Chris@101: Context Chris@101: >::type Chris@101: >::type Chris@101: outer_env_type; Chris@16: Chris@101: typedef Chris@101: typename remove_pointer< Chris@101: typename remove_reference< Chris@101: typename fusion::result_of::at_c< Chris@101: outer_env_type Chris@101: , 0 Chris@101: >::type Chris@101: >::type Chris@101: >::type Chris@101: actor_type; Chris@16: Chris@101: typedef Chris@101: typename result_of::eval< Chris@101: A0 const & Chris@101: , Context const & Chris@101: >::type Chris@101: a0_type; Chris@16: Chris@101: typedef Chris@101: vector2 Chris@101: inner_env_type; Chris@16: Chris@101: typedef Chris@101: scoped_environment< Chris@101: inner_env_type Chris@101: , outer_env_type Chris@101: , vector0<> Chris@101: , detail::map_local_index_to_tuple<> Chris@101: > Chris@101: env_type; Chris@101: Chris@101: inner_env_type inner_env = {fusion::at_c<0>(phoenix::env(ctx)), phoenix::eval(a0, ctx)}; Chris@101: vector0<> locals; Chris@101: env_type env(inner_env, phoenix::env(ctx), locals); Chris@101: Chris@101: 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@101: template Chris@16: struct is_nullary::when Chris@16: : proto::make Chris@16: {}; Chris@16: Chris@101: template Chris@101: typename expression::this_::type const Chris@101: this_(A0 const & a0) Chris@101: { Chris@101: return expression::this_::make(a0); Chris@101: } Chris@16: Chris@16: }} Chris@16: Chris@16: #endif