You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
191 lines
4.6 KiB
191 lines
4.6 KiB
/*============================================================================= |
|
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
|
|
|