Chris@16: #if !defined(BOOST_PP_IS_ITERATING) Chris@16: Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: # ifndef RESULT_DWA2002521_HPP Chris@16: # define RESULT_DWA2002521_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace detail { Chris@16: Chris@16: // Defines a family of overloaded function which, given x, a function Chris@16: // pointer, member [function] pointer, or an AdaptableFunction object, Chris@16: // returns a pointer to type*, where R is the result type of Chris@16: // invoking the result of bind(x). Chris@16: // Chris@16: // In order to work around bugs in deficient compilers, if x might be Chris@16: // an AdaptableFunction object, you must pass OL as a second argument Chris@16: // to get this to work portably. Chris@16: Chris@16: # define BOOST_PP_ITERATION_PARAMS_1 \ Chris@16: (4, (0, BOOST_PYTHON_MAX_ARITY, , BOOST_PYTHON_FUNCTION_POINTER)) Chris@16: # include BOOST_PP_ITERATE() Chris@16: Chris@16: # define BOOST_PP_ITERATION_PARAMS_1 \ Chris@16: (4, (0, BOOST_PYTHON_CV_COUNT - 1, , BOOST_PYTHON_POINTER_TO_MEMBER)) Chris@16: # include BOOST_PP_ITERATE() Chris@16: Chris@16: template Chris@16: boost::type* result(R (T::*), int = 0) { return 0; } Chris@16: Chris@16: # if (defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140) \ Chris@16: || (defined(__GNUC__) && __GNUC__ < 3) \ Chris@16: || (defined(__MWERKS__) && __MWERKS__ < 0x3000) Chris@16: // This code actually works on all implementations, but why use it when we don't have to? Chris@16: template Chris@16: struct get_result_type Chris@16: { Chris@16: typedef boost::type type; Chris@16: }; Chris@16: Chris@16: struct void_type Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct result_result Chris@16: { Chris@16: typedef typename mpl::if_c< Chris@16: is_class::value Chris@16: , get_result_type Chris@16: , void_type Chris@16: >::type t1; Chris@16: Chris@16: typedef typename t1::type* type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename result_result::type Chris@16: result(X const&, short) { return 0; } Chris@16: Chris@16: # else // Simpler code for more-capable compilers Chris@16: template Chris@16: boost::type* Chris@16: result(X const&, short = 0) { return 0; } Chris@16: Chris@16: # endif Chris@16: Chris@16: }}} // namespace boost::python::detail Chris@16: Chris@16: # endif // RESULT_DWA2002521_HPP Chris@16: Chris@16: /* --------------- function pointers --------------- */ Chris@16: // For gcc 4.4 compatability, we must include the Chris@16: // BOOST_PP_ITERATION_DEPTH test inside an #else clause. Chris@16: #else // BOOST_PP_IS_ITERATING Chris@16: #if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER Chris@16: # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ Chris@16: && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) Chris@16: # line BOOST_PP_LINE(__LINE__, result.hpp(function pointers)) Chris@16: # endif Chris@16: Chris@16: # define N BOOST_PP_ITERATION() Chris@16: Chris@16: template Chris@16: boost::type* result(R (*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)), int = 0) Chris@16: { Chris@16: return 0; Chris@16: } Chris@16: Chris@16: # undef N Chris@16: Chris@16: /* --------------- pointers-to-members --------------- */ Chris@16: #elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_POINTER_TO_MEMBER Chris@16: // Outer over cv-qualifiers Chris@16: Chris@16: # define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PYTHON_MAX_ARITY, )) Chris@16: # include BOOST_PP_ITERATE() Chris@16: Chris@16: #elif BOOST_PP_ITERATION_DEPTH() == 2 Chris@16: # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ Chris@16: && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) Chris@16: # line BOOST_PP_LINE(__LINE__, result.hpp(pointers-to-members)) Chris@16: # endif Chris@16: // Inner over arities Chris@16: Chris@16: # define N BOOST_PP_ITERATION() Chris@16: # define Q BOOST_PYTHON_CV_QUALIFIER(BOOST_PP_RELATIVE_ITERATION(1)) Chris@16: Chris@16: template Chris@16: boost::type* result(R (T::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)) Q, int = 0) Chris@16: { Chris@16: return 0; Chris@16: } Chris@16: Chris@16: # undef N Chris@16: # undef Q Chris@16: Chris@16: #endif // BOOST_PP_ITERATION_DEPTH() Chris@16: #endif