/*============================================================================== Copyright (c) 2005-2010 Joel de Guzman Copyright (c) 2010-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_CORE_ENVIRONMENT_HPP #define BOOST_PHOENIX_CORE_ENVIRONMENT_HPP #include #include #include #include #include #include #include #include namespace boost { namespace phoenix { struct unused {}; namespace result_of { template struct context { typedef vector2 type; }; template struct make_context : context {}; template struct env { typedef typename fusion::result_of::at_c< typename boost::remove_reference::type , 0 >::type type; }; template struct actions { typedef typename fusion::result_of::at_c< typename boost::remove_reference::type , 1 >::type type; }; } namespace functional { struct context { BOOST_PROTO_CALLABLE() template struct result; template struct result : result {}; template struct result : result {}; template struct result : result {}; template struct result : result_of::context {}; template typename result_of::context::type operator()(Env & env, Actions & actions) const { vector2 e = {env, actions}; return e; } template typename result_of::context::type operator()(Env const & env, Actions & actions) const { vector2 e = {env, actions}; return e; } template typename result_of::context::type operator()(Env & env, Actions const & actions) const { vector2 e = {env, actions}; return e; } template typename result_of::context::type operator()(Env const & env, Actions const & actions) const { vector2 e = {env, actions}; return e; } }; struct make_context : context {}; struct env { BOOST_PROTO_CALLABLE() template struct result; template struct result : result {}; template struct result : result_of::env {}; template typename result_of::env::type operator()(Context const & ctx) const { return fusion::at_c<0>(ctx); } template typename result_of::env::type operator()(Context & ctx) const { return fusion::at_c<0>(ctx); } }; struct actions { BOOST_PROTO_CALLABLE() template struct result; template struct result : result {}; template struct result : result_of::actions {}; template typename result_of::actions::type operator()(Context const & ctx) const { return fusion::at_c<1>(ctx); } template typename result_of::actions::type operator()(Context & ctx) const { return fusion::at_c<1>(ctx); } }; } struct _context : proto::transform<_context> { template struct impl : proto::transform_impl { typedef vector2 result_type; result_type operator()( typename impl::expr_param , typename impl::state_param s , typename impl::data_param d ) const { vector2 e = {s, d}; return e; } }; }; template typename result_of::context::type const inline context(Env const& env, Actions const& actions) { vector2 e = {env, actions}; return e; } template typename result_of::context::type const inline make_context(Env const& env, Actions const& actions) { return context(env, actions); } template typename result_of::context::type const inline context(Env & env, Actions const& actions) { vector2 e = {env, actions}; return e; } template typename result_of::context::type const inline make_context(Env & env, Actions const& actions) { return context(env, actions); } template typename result_of::context::type const inline context(Env const& env, Actions & actions) { vector2 e = {env, actions}; return e; } template typename result_of::context::type const inline make_context(Env const& env, Actions & actions) { return context(env, actions); } template typename result_of::context::type const inline context(Env & env, Actions & actions) { vector2 e = {env, actions}; return e; } template typename result_of::context::type const inline make_context(Env & env, Actions & actions) { return context(env, actions); } struct _env : proto::transform<_env> { template struct impl : proto::transform_impl { typedef State result_type; result_type operator()( typename impl::expr_param , typename impl::state_param s , typename impl::data_param ) const { return s; } }; }; template struct _env::impl : proto::transform_impl { typedef typename fusion::result_of::at_c< typename boost::remove_reference::type , 0 >::type result_type; result_type operator()( typename impl::expr_param , typename impl::state_param s , typename impl::data_param ) const { return fusion::at_c<0>(s); } }; template struct _env::impl : _env::impl {}; template typename fusion::result_of::at_c::type inline env(Context & ctx) { return fusion::at_c<0>(ctx); } template typename fusion::result_of::at_c::type inline env(Context const & ctx) { return fusion::at_c<0>(ctx); } struct _actions : proto::transform<_actions> { template struct impl : proto::transform_impl { typedef Data result_type; result_type operator()( typename impl::expr_param , typename impl::state_param , typename impl::data_param d ) const { return d; } }; }; template struct _actions::impl : proto::transform_impl { typedef typename fusion::result_of::at_c< typename boost::remove_reference::type , 1 >::type result_type; result_type operator()( typename impl::expr_param , typename impl::state_param s , typename impl::data_param ) const { return fusion::at_c<1>(s); } }; template struct _actions::impl : _actions::impl {}; template typename fusion::result_of::at_c::type inline actions(Context & ctx) { return fusion::at_c<1>(ctx); } template typename fusion::result_of::at_c::type inline actions(Context const & ctx) { return fusion::at_c<1>(ctx); } namespace result_of { template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( BOOST_PHOENIX_LIMIT , typename A , mpl::void_ ) , typename Dummy = void > struct make_env; #define BOOST_PHOENIX_M0(Z, N, D) \ template \ struct make_env \ { \ typedef BOOST_PP_CAT(vector, N) type; \ }; \ /**/ BOOST_PP_REPEAT_FROM_TO(1, BOOST_PHOENIX_LIMIT, BOOST_PHOENIX_M0, _) #undef BOOST_PHOENIX_M0 } result_of::make_env<>::type inline make_env() { return result_of::make_env<>::type(); } #define BOOST_PHOENIX_M0(Z, N, D) \ template \ typename result_of::make_env::type \ inline make_env(BOOST_PHOENIX_A_ref_a(N)) \ { \ typename result_of::make_env::type \ env = \ { \ BOOST_PHOENIX_a(N) \ }; \ return env; \ } \ template \ typename result_of::make_env::type \ inline make_env(BOOST_PHOENIX_A_const_ref_a(N)) \ { \ typename result_of::make_env::type \ env = \ { \ BOOST_PHOENIX_a(N) \ }; \ return env; \ } \ /**/ BOOST_PP_REPEAT_FROM_TO(1, BOOST_PHOENIX_LIMIT, BOOST_PHOENIX_M0, _) #undef BOOST_PHOENIX_M0 template struct is_environment : fusion::traits::is_sequence {}; }} #endif