123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*=============================================================================
- 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
|