| /*============================================================================= |
| 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 !BOOST_PHOENIX_IS_ITERATING |
| |
| #ifndef BOOST_PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP |
| #define BOOST_PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP |
| |
| #include <boost/phoenix/core/limits.hpp> |
| #include <boost/phoenix/support/iterate.hpp> |
| |
| namespace boost { namespace phoenix { namespace detail |
| { |
| template <int N, typename Dummy = void> |
| struct function_ptr_impl |
| { |
| template <typename RT, typename FP> |
| struct impl; |
| }; |
| |
| template <int N, typename RT, typename FP> |
| struct function_ptr : function_ptr_impl<N>::template impl<RT, FP> |
| { |
| typedef typename function_ptr_impl<N>::template impl<RT, FP> base; |
| |
| function_ptr(FP fp) |
| : base(fp) {} |
| |
| using base::fp; |
| |
| bool operator==(function_ptr const & rhs) const |
| { |
| return fp == rhs.fp; |
| } |
| |
| template <int M, typename RhsRT, typename RhsFP> |
| bool operator==(function_ptr<M, RhsRT, RhsFP> const & rhs) const |
| { |
| return false; |
| } |
| |
| }; |
| |
| template <typename Dummy> |
| struct function_ptr_impl<0, Dummy> |
| { |
| template <typename RT, typename FP> |
| struct impl |
| { |
| typedef RT result_type; |
| |
| impl(FP fp) |
| : fp(fp) {} |
| |
| RT operator()() const |
| { |
| return fp(); |
| } |
| |
| FP fp; |
| }; |
| }; |
| |
| template <typename Dummy> |
| struct function_ptr_impl<1, Dummy> |
| { |
| template <typename RT, typename FP> |
| struct impl |
| { |
| typedef RT result_type; |
| |
| impl(FP fp) |
| : fp(fp) {} |
| |
| template <typename A> |
| RT operator()(A &a) const |
| { |
| return fp(a); |
| } |
| |
| FP fp; |
| }; |
| }; |
| |
| #if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES) |
| #include <boost/phoenix/bind/detail/preprocessed/function_ptr.hpp> |
| #else |
| |
| #if defined(__WAVE__) && defined (BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) |
| #pragma wave option(preserve: 2, line: 0, output: "preprocessed/function_ptr_" 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_PHOENIX_COMPOSITE_LIMIT, \ |
| <boost/phoenix/bind/detail/function_ptr.hpp>)) |
| #include BOOST_PHOENIX_ITERATE() |
| |
| #if defined(__WAVE__) && defined (BOOST_PHOENIX_CREATE_PREPROCESSED_FILES) |
| #pragma wave option(output: null) |
| #endif |
| |
| #endif |
| |
| }}} // namespace boost::phoenix::detail |
| |
| #endif |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Preprocessor vertical repetition code |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| #else // defined(BOOST_PP_IS_ITERATING) |
| |
| template <typename Dummy> |
| struct function_ptr_impl<BOOST_PHOENIX_ITERATION, Dummy> |
| { |
| template <typename RT, typename FP> |
| struct impl |
| { |
| typedef RT result_type; |
| |
| impl(FP fp) |
| : fp(fp) {} |
| |
| template <BOOST_PHOENIX_typename_A> |
| RT operator()(BOOST_PHOENIX_A_ref_a) const |
| { |
| return fp(BOOST_PHOENIX_a); |
| } |
| |
| FP fp; |
| }; |
| }; |
| |
| #endif // defined(BOOST_PP_IS_ITERATING) |