diff options
Diffstat (limited to 'boost/phoenix/bind/bind_function.hpp')
-rw-r--r-- | boost/phoenix/bind/bind_function.hpp | 148 |
1 files changed, 48 insertions, 100 deletions
diff --git a/boost/phoenix/bind/bind_function.hpp b/boost/phoenix/bind/bind_function.hpp index ea1e2d76c0..fdb2fc543d 100644 --- a/boost/phoenix/bind/bind_function.hpp +++ b/boost/phoenix/bind/bind_function.hpp @@ -1,118 +1,66 @@ /*============================================================================= - Copyright (c) 2001-2007 Joel de Guzman + Copyright (c) 2016 Kohei Takahashi - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 !BOOST_PHOENIX_IS_ITERATING - #ifndef PHOENIX_BIND_BIND_FUNCTION_HPP #define PHOENIX_BIND_BIND_FUNCTION_HPP +#include <boost/phoenix/core/limits.hpp> + +#if defined(BOOST_PHOENIX_NO_VARIADIC_BIND) +# include <boost/phoenix/bind/detail/cpp03/bind_function.hpp> +#else + #include <boost/phoenix/core/expression.hpp> #include <boost/phoenix/core/detail/function_eval.hpp> -#include <boost/phoenix/bind/detail/function_ptr.hpp> -namespace boost { namespace phoenix { - - template < - typename RT - > - inline - typename detail::expression::function_eval< - detail::function_ptr<0, RT, RT(*)()> - >::type const - bind(RT(*f)()) +namespace boost { namespace phoenix +{ + namespace detail { - typedef detail::function_ptr<0, RT, RT(*)()> fp_type; - return detail::expression::function_eval<fp_type>::make(fp_type(f)); - } - - template < - typename RT - , typename T0 - , typename A0 - > - inline - typename detail::expression::function_eval< - detail::function_ptr<1, RT, RT(*)(T0)> - , A0 + template <typename RT, typename FP> + struct function_ptr + { + typedef RT result_type; + + function_ptr(FP fp_) + : fp(fp_) {} + + template <typename... A> + result_type operator()(A&... a) const + { + return fp(a...); + } + + bool operator==(function_ptr const& rhs) const + { + return fp == rhs.fp; + } + + template <typename RhsRT, typename RhsFP> + bool operator==(function_ptr<RhsRT, RhsFP> const& /*rhs*/) const + { + return false; + } + + FP fp; + }; + } // namespace boost::phoenix::detail + + template <typename RT, typename... T, typename... A> + inline typename detail::expression::function_eval< + detail::function_ptr<RT, RT (*)(T...)> + , A... >::type const - bind(RT(*f)(T0), A0 const & a0) + bind(RT (*f)(T...), A const&... a) { - typedef detail::function_ptr<1, RT, RT(*)(T0)> fp_type; - return detail::expression::function_eval<fp_type, A0>::make(fp_type(f), a0); + typedef detail::function_ptr<RT, RT (*)(T...)> fp_type; + return detail::expression::function_eval<fp_type, A...>::make(fp_type(f), a...); } - -#if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES) - #include <boost/phoenix/bind/preprocessed/bind_function.hpp> -#else - -#if defined(__WAVE__) && defined (BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) - #pragma wave option(preserve: 2, line: 0, output: "preprocessed/bind_function_" 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) -#endif - -#define BOOST_PHOENIX_ITERATION_PARAMS \ - (3, (2, BOOST_PP_DEC(BOOST_PHOENIX_ACTOR_LIMIT), \ - <boost/phoenix/bind/bind_function.hpp>)) -#include BOOST_PHOENIX_ITERATE() - -#if defined(__WAVE__) && defined (BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) - #pragma wave option(output: null) -#endif - -#endif - -}} +}} // namespace boost::phoenix #endif - -#else - - template < - typename RT - , BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, typename T) - , BOOST_PHOENIX_typename_A - > - inline - typename detail::expression::function_eval< - detail::function_ptr< - BOOST_PHOENIX_ITERATION - , RT - , RT(*)(BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, T)) - > - , BOOST_PHOENIX_A - >::type const - bind( - RT(*f)(BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, T)) - , BOOST_PHOENIX_A_const_ref_a - ) - { - typedef detail::function_ptr< - BOOST_PHOENIX_ITERATION - , RT - , RT(*)(BOOST_PP_ENUM_PARAMS(BOOST_PHOENIX_ITERATION, T)) - > fp_type; - return - detail::expression::function_eval< - fp_type - , BOOST_PHOENIX_A - >::make( - fp_type(f) - , BOOST_PHOENIX_a - ); - } - #endif |