summaryrefslogtreecommitdiff
path: root/boost/phoenix/bind/bind_function.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/phoenix/bind/bind_function.hpp')
-rw-r--r--boost/phoenix/bind/bind_function.hpp148
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