You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
149 lines
4.4 KiB
149 lines
4.4 KiB
/*============================================================================= |
|
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_MEMBER_FUNCTION_PTR_HPP |
|
#define BOOST_PHOENIX_BIND_DETAIL_MEMBER_FUNCTION_PTR_HPP |
|
|
|
#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 & rhs) 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::classtypeof<FP>::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/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/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 |
|
|
|
#endif |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// 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::classtypeof<FP>::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)
|
|
|