192 lines
5.7 KiB
C++
192 lines
5.7 KiB
C++
|
/*=============================================================================
|
||
|
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
|