diff options
Diffstat (limited to 'boost/phoenix/core/detail/function_eval.hpp')
-rw-r--r-- | boost/phoenix/core/detail/function_eval.hpp | 194 |
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 |