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