Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/phoenix/scope/this.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/phoenix/scope/this.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,191 @@ +/*============================================================================= + 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