/*============================================================================= | |
Copyright (c) 2001-2007 Joel de Guzman | |
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 PHOENIX_CORE_COMPOSE_HPP | |
#define PHOENIX_CORE_COMPOSE_HPP | |
#include <boost/mpl/eval_if.hpp> | |
#include <boost/mpl/identity.hpp> | |
#include <boost/type_traits/is_same.hpp> | |
#include <boost/preprocessor/repetition/enum.hpp> | |
#include <boost/preprocessor/repetition/enum_params.hpp> | |
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> | |
#include <boost/spirit/home/phoenix/core/composite.hpp> | |
#include <boost/spirit/home/phoenix/core/value.hpp> | |
#include <boost/spirit/home/phoenix/core/as_actor.hpp> | |
#define PHOENIX_AS_ACTOR(z, n, data) \ | |
typename mpl::eval_if< \ | |
is_same<BOOST_PP_CAT(T, n), fusion::void_> \ | |
, mpl::identity<fusion::void_> \ | |
, as_actor_base<BOOST_PP_CAT(T, n)> \ | |
>::type | |
namespace boost { namespace phoenix | |
{ | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// as_composite<EvalPolicy, T0,... TN> metafunction | |
// | |
// Create a composite given an EvalPolicy and types T0..TN. | |
// The types are converted to an actor through the as_actor | |
// metafunction (see as_actor.hpp). | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
template < | |
typename EvalPolicy | |
, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( | |
PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)> | |
struct as_composite | |
{ | |
typedef composite< | |
EvalPolicy | |
, fusion::vector< | |
BOOST_PP_ENUM(PHOENIX_COMPOSITE_LIMIT, PHOENIX_AS_ACTOR, _)> | |
> | |
type; | |
}; | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// compose functions | |
// | |
// Usage: | |
// | |
// compose<EvalPolicy>(_0, _1,... _N) | |
// | |
// Returns a composite given an EvalPolicy and arguments _0.._N. | |
// The arguments are converted to an actor through the as_actor | |
// metafunction (see as_actor.hpp). | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
template <typename EvalPolicy> | |
inline actor<typename as_composite<EvalPolicy>::type> | |
compose() | |
{ | |
return actor<typename as_composite<EvalPolicy>::type>(); | |
} | |
template <typename EvalPolicy, typename T0> | |
inline actor<typename as_composite<EvalPolicy, T0>::type> | |
compose(T0 const& _0) | |
{ | |
return actor<typename as_composite<EvalPolicy, T0>::type>( | |
as_actor<T0>::convert(_0) | |
); | |
} | |
template <typename EvalPolicy, typename T0, typename T1> | |
inline actor<typename as_composite<EvalPolicy, T0, T1>::type> | |
compose(T0 const& _0, T1 const& _1) | |
{ | |
return actor<typename as_composite<EvalPolicy, T0, T1>::type>( | |
as_actor<T0>::convert(_0) | |
, as_actor<T1>::convert(_1) | |
); | |
} | |
// Bring in the the rest of the compose overloads | |
#include <boost/spirit/home/phoenix/core/detail/compose.hpp> | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// re_curry<EvalPolicy, T0,...TN> | |
// | |
// returns the result of re currying T0..TN using EvalPolicy. | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
template < | |
typename EvalPolicy | |
, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( | |
PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)> | |
struct re_curry | |
{ | |
typedef actor< | |
typename as_composite< | |
EvalPolicy | |
, BOOST_PP_ENUM_PARAMS(PHOENIX_COMPOSITE_LIMIT, T)>::type | |
> | |
type; | |
}; | |
}} | |
#undef PHOENIX_AS_ACTOR | |
#endif |