123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /*=============================================================================
- 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
- #include <boost/phoenix/core/limits.hpp>
- #include <boost/phoenix/support/iterate.hpp>
- namespace boost { namespace phoenix { namespace detail
- {
- template <int N>
- struct member_function_ptr_impl
- {
- template <typename RT, typename FP>
- struct impl;
- };
- template <int N, typename RT, typename FP>
- struct member_function_ptr
- : member_function_ptr_impl<N>::template impl<RT, FP>
- {
- typedef typename member_function_ptr_impl<N>::
- template impl<RT, FP> base;
- member_function_ptr(FP fp_)
- : base(fp_) {}
-
- using base::fp;
- bool operator==(member_function_ptr const & rhs) const
- {
- return fp == rhs.fp;
- }
- template <int M, typename RhsRT, typename RhsFP>
- bool operator==(member_function_ptr<M, RhsRT, RhsFP> const &) const
- {
- return false;
- }
- };
- template <>
- struct member_function_ptr_impl<0>
- {
- template <typename RT, typename FP>
- struct impl
- {
- typedef RT result_type;
- impl(FP fp_)
- : fp(fp_) {}
- template <typename Class>
- RT operator()(Class& obj) const
- {
- BOOST_PROTO_USE_GET_POINTER();
- typedef typename proto::detail::class_member_traits<FP>::class_type class_type;
- return (BOOST_PROTO_GET_POINTER(class_type, obj) ->*fp)();
- }
- template <typename Class>
- RT operator()(Class* obj) const
- {
- return (obj->*fp)();
- }
- FP fp;
- };
- };
- #if !defined(BOOST_PHOENIX_DONT_USE_PREPROCESSED_FILES)
- #include <boost/phoenix/bind/detail/cpp03/preprocessed/member_function_ptr.hpp>
- #else
- #if defined(__WAVE__) && defined (BOOST_PHOENIX_CREATE_PREPROCESSED_FILES)
- #pragma wave option(preserve: 2, line: 0, output: "preprocessed/member_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, (1, BOOST_PHOENIX_COMPOSITE_LIMIT, \
- <boost/phoenix/bind/detail/cpp03/member_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
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Preprocessor vertical repetition code
- //
- ///////////////////////////////////////////////////////////////////////////////
- #else
- template <>
- struct member_function_ptr_impl<BOOST_PHOENIX_ITERATION>
- {
- template <typename RT, typename FP>
- struct impl
- {
- typedef RT result_type;
- impl(FP fp_)
- : fp(fp_) {}
- template <typename Class, BOOST_PHOENIX_typename_A>
- RT operator()(Class& obj, BOOST_PHOENIX_A_ref_a) const
- {
- BOOST_PROTO_USE_GET_POINTER();
- typedef typename proto::detail::class_member_traits<FP>::class_type class_type;
- return (BOOST_PROTO_GET_POINTER(class_type, obj)->*fp)(BOOST_PHOENIX_a);
- }
- template <typename Class, BOOST_PHOENIX_typename_A>
- RT operator()(Class* obj, BOOST_PHOENIX_A_ref_a) const
- {
- return (obj->*fp)(BOOST_PHOENIX_a);
- }
- FP fp;
- };
- };
- #endif // defined(BOOST_PP_IS_ITERATING)
|