Chris@16: #if !defined(BOOST_PP_IS_ITERATING) Chris@16: Chris@16: // Copyright David Abrahams 2004. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef OVERRIDE_DWA2004721_HPP Chris@16: # define OVERRIDE_DWA2004721_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: # include Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: class override; Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: class wrapper_base; Chris@16: Chris@16: // The result of calling a method. Chris@16: class method_result Chris@16: { Chris@16: private: Chris@16: friend class boost::python::override; Chris@16: explicit method_result(PyObject* x) Chris@16: : m_obj(x) Chris@16: {} Chris@16: Chris@16: public: Chris@16: template Chris@16: operator T() Chris@16: { Chris@16: converter::return_from_python converter; Chris@16: return converter(m_obj.release()); Chris@16: } Chris@16: Chris@16: # if BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(140050215)) Chris@16: template Chris@16: operator T*() Chris@16: { Chris@16: converter::return_from_python converter; Chris@16: return converter(m_obj.release()); Chris@16: } Chris@16: # endif Chris@16: Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) || BOOST_WORKAROUND(BOOST_INTEL_WIN, >= 900) Chris@16: // No operator T& Chris@16: # else Chris@16: Chris@16: template Chris@16: operator T&() const Chris@16: { Chris@16: converter::return_from_python converter; Chris@16: return converter(const_cast&>(m_obj).release()); Chris@16: } Chris@16: # endif Chris@16: Chris@16: template Chris@16: T as(type* = 0) Chris@16: { Chris@16: converter::return_from_python converter; Chris@16: return converter(m_obj.release()); Chris@16: } Chris@16: Chris@16: template Chris@16: T unchecked(type* = 0) Chris@16: { Chris@16: return extract(m_obj.get())(); Chris@16: } Chris@16: private: Chris@16: mutable handle<> m_obj; Chris@16: }; Chris@16: } Chris@16: Chris@16: class override : public object Chris@16: { Chris@16: private: Chris@16: friend class detail::wrapper_base; Chris@16: override(handle<> x) Chris@16: : object(x) Chris@16: {} Chris@16: Chris@16: public: Chris@16: detail::method_result Chris@16: operator()() const Chris@16: { Chris@16: detail::method_result x( Chris@16: PyEval_CallFunction( Chris@16: this->ptr() Chris@16: , const_cast("()") Chris@16: )); Chris@16: return x; Chris@16: } Chris@16: Chris@16: # define BOOST_PYTHON_fast_arg_to_python_get(z, n, _) \ Chris@16: , converter::arg_to_python(a##n).get() Chris@16: Chris@16: # define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, )) Chris@16: # include BOOST_PP_ITERATE() Chris@16: Chris@16: # undef BOOST_PYTHON_fast_arg_to_python_get Chris@16: }; Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: #endif // OVERRIDE_DWA2004721_HPP Chris@16: Chris@16: #else Chris@16: # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ Chris@16: && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) Chris@16: # line BOOST_PP_LINE(__LINE__, override.hpp) Chris@16: # endif Chris@16: Chris@16: # define N BOOST_PP_ITERATION() Chris@16: Chris@16: template < Chris@16: BOOST_PP_ENUM_PARAMS_Z(1, N, class A) Chris@16: > Chris@16: detail::method_result Chris@16: operator()( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a) ) const Chris@16: { Chris@16: detail::method_result x( Chris@16: PyEval_CallFunction( Chris@16: this->ptr() Chris@16: , const_cast("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") Chris@16: BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_fast_arg_to_python_get, nil) Chris@16: )); Chris@16: return x; Chris@16: } Chris@16: Chris@16: # undef N Chris@16: #endif