summaryrefslogtreecommitdiff
path: root/boost/phoenix/core/detail/function_eval.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/phoenix/core/detail/function_eval.hpp')
-rw-r--r--boost/phoenix/core/detail/function_eval.hpp194
1 files changed, 70 insertions, 124 deletions
diff --git a/boost/phoenix/core/detail/function_eval.hpp b/boost/phoenix/core/detail/function_eval.hpp
index 6ffea2b4a4..b32dfafeb1 100644
--- a/boost/phoenix/core/detail/function_eval.hpp
+++ b/boost/phoenix/core/detail/function_eval.hpp
@@ -1,22 +1,10 @@
-#if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES)
-
-#ifndef BOOST_PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP
-#define BOOST_PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP
-
-#include <boost/phoenix/core/limits.hpp>
-#include <boost/phoenix/support/iterate.hpp>
-#include <boost/phoenix/core/call.hpp>
-#include <boost/phoenix/core/expression.hpp>
-#include <boost/phoenix/core/meta_grammar.hpp>
-#include <boost/phoenix/core/detail/phx2_result.hpp>
-#include <boost/utility/result_of.hpp>
-
-#include <boost/phoenix/core/detail/preprocessed/function_eval.hpp>
-
-#endif
-#else
+/*=============================================================================
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2015 Kohei Takahashi
-#if !BOOST_PHOENIX_IS_ITERATING
+ 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_DETAIL_FUNCTION_EVAL_HPP
#define BOOST_PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP
@@ -29,27 +17,20 @@
#include <boost/phoenix/core/detail/phx2_result.hpp>
#include <boost/utility/result_of.hpp>
-#if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 2, line: 0, output: "preprocessed/function_eval_" BOOST_PHOENIX_LIMIT_STR ".hpp")
-#endif
-/*=============================================================================
- 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)
-==============================================================================*/
-
-
-#if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 1)
+#ifndef BOOST_PHOENIX_NO_VARIADIC_FUNCTION_EVAL
+# include <boost/mpl/if.hpp>
+# include <boost/type_traits/is_reference.hpp>
#endif
+#ifdef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
+# include <boost/phoenix/core/detail/cpp03/function_eval_expr.hpp>
+#else
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
(boost)(phoenix)(detail)(function_eval)
- , (meta_grammar)
- (meta_grammar)
- , BOOST_PP_DEC(BOOST_PHOENIX_COMPOSITE_LIMIT)
+ , (meta_grammar)(meta_grammar)
+ , _
)
+#endif
namespace boost { namespace phoenix {
namespace detail
@@ -59,7 +40,7 @@ namespace boost { namespace phoenix {
{
return x;
}
-
+
template <typename T>
T const& help_rvalue_deduction(T const& x)
{
@@ -71,6 +52,7 @@ namespace boost { namespace phoenix {
template <typename Sig>
struct result;
+#ifdef BOOST_PHOENIX_NO_VARIADIC_FUNCTION_EVAL
template <typename This, typename F, typename Context>
struct result<This(F, Context)>
{
@@ -97,60 +79,18 @@ namespace boost { namespace phoenix {
return boost::phoenix::eval(f, ctx)();
}
- #define PHOENIX_GET_ARG(z, n, data) \
- typedef \
- typename boost::add_reference< \
- typename boost::add_const< \
- typename boost::result_of< \
- boost::phoenix::evaluator( \
- BOOST_PP_CAT(A, n) \
- , Context \
- ) \
- >::type \
- >::type \
- >::type \
- BOOST_PP_CAT(a, n);
-
- #define PHOENIX_EVAL_ARG(z, n, data) \
- help_rvalue_deduction(boost::phoenix::eval(BOOST_PP_CAT(a, n), ctx))
-
- #define M0(z, n, data) \
- typename proto::detail::uncvref<BOOST_PP_CAT(a, n)>::type
-
- #define BOOST_PHOENIX_ITERATION_PARAMS \
- (3, (1, BOOST_PP_DEC(BOOST_PHOENIX_ACTOR_LIMIT), \
- <boost/phoenix/core/detail/function_eval.hpp>))
-#include BOOST_PHOENIX_ITERATE()
-
- #undef PHOENIX_GET_ARG
- #undef PHOENIX_EVAL_ARG
- #undef M0
-
- };
-
- }
-
- template <typename Dummy>
- struct default_actions::when<detail::rule::function_eval, Dummy>
- : phoenix::call<detail::function_eval>
- {};
-}}
-
-#if defined(__WAVE__) && defined(BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
-#pragma wave option(output: null)
-#endif
-
+ #include <boost/phoenix/core/detail/cpp03/function_eval.hpp>
+#else
+ template <typename, typename, typename...> struct result_impl;
-#endif
+ template <typename F, typename... A, typename Head, typename... Tail>
+ struct result_impl<F, void(A...), Head, Tail...>
+ : result_impl<F, void(A..., Head), Tail...>
+ {
+ };
-#else
- template <
- typename This
- , typename F
- , BOOST_PHOENIX_typename_A
- , typename Context
- >
- struct result<This(F, BOOST_PHOENIX_A, Context)>
+ template <typename F, typename... A, typename Context>
+ struct result_impl<F, void(A...), Context>
{
typedef typename
remove_reference<
@@ -158,57 +98,63 @@ namespace boost { namespace phoenix {
>::type
fn;
- BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, PHOENIX_GET_ARG, _)
+ template <typename T>
+ struct result_of_evaluator
+ {
+ typedef typename boost::add_reference<
+ typename boost::add_const<
+ typename boost::result_of<
+ boost::phoenix::evaluator(T, Context)
+ >::type
+ >::type
+ >::type type;
+ };
typedef typename
- boost::result_of<fn(BOOST_PHOENIX_a)>::type
- type;
- /*
- typedef typename
- mpl::eval_if_c<
- has_phx2_result<
- fn
- , BOOST_PP_ENUM(BOOST_PHOENIX_ITERATION, M0, _)
- >::value
- , boost::result_of<
- fn(
- BOOST_PHOENIX_a
- )
- >
- , phx2_result<
- fn
- , BOOST_PHOENIX_a
- >
+ boost::result_of<
+ fn(typename result_of_evaluator<A>::type...)
>::type
type;
- */
+
+ static type call(F f, A... a, Context ctx)
+ {
+ return boost::phoenix::eval(f, ctx)(help_rvalue_deduction(boost::phoenix::eval(a, ctx))...);
+ }
};
- template <typename F, BOOST_PHOENIX_typename_A, typename Context>
- typename result<
- function_eval(
- F const &
- , BOOST_PHOENIX_A_ref
- , Context const &
- )
- >::type
- operator()(F const & f, BOOST_PHOENIX_A_ref_a, Context const & ctx) const
+ template <typename This, typename F, typename... A>
+ struct result<This(F, A...)>
+ : result_impl<F, void(), A...>
{
- return boost::phoenix::eval(f, ctx)(BOOST_PP_ENUM(BOOST_PHOENIX_ITERATION, PHOENIX_EVAL_ARG, _));
- }
+ };
- template <typename F, BOOST_PHOENIX_typename_A, typename Context>
+ template <typename F, typename... A>
typename result<
function_eval(
- F &
- , BOOST_PHOENIX_A_ref
- , Context const &
+ F const &
+ , typename mpl::if_<is_reference<A>, A, A const &>::type...
)
>::type
- operator()(F & f, BOOST_PHOENIX_A_ref_a, Context const & ctx) const
+ // 'A &... a, Context const &ctx' doesn't work as intended: type deduction always fail.
+ operator()(F && f, A &&... a) const
{
- return boost::phoenix::eval(f, ctx)(BOOST_PP_ENUM(BOOST_PHOENIX_ITERATION, PHOENIX_EVAL_ARG, _));
+ return
+ result<
+ function_eval(
+ typename mpl::if_<is_reference<F>, F, F const &>::type
+ , typename mpl::if_<is_reference<A>, A, A const &>::type...
+ )
+ >::call(f, a...);
}
#endif
+ };
+
+ }
+
+ template <typename Dummy>
+ struct default_actions::when<detail::rule::function_eval, Dummy>
+ : phoenix::call<detail::function_eval>
+ {};
+}}
#endif