#if !defined(BOOST_PP_IS_ITERATING) | |
// Copyright David Abrahams 2004. 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) | |
#ifndef OVERRIDE_DWA2004721_HPP | |
# define OVERRIDE_DWA2004721_HPP | |
# include <boost/python/detail/prefix.hpp> | |
# include <boost/python/converter/return_from_python.hpp> | |
# include <boost/python/extract.hpp> | |
# include <boost/python/handle.hpp> | |
# include <boost/preprocessor/iterate.hpp> | |
# include <boost/preprocessor/repeat.hpp> | |
# include <boost/preprocessor/debug/line.hpp> | |
# include <boost/preprocessor/repetition/enum_params.hpp> | |
# include <boost/preprocessor/repetition/enum_binary_params.hpp> | |
# include <boost/type.hpp> | |
namespace boost { namespace python { | |
class override; | |
namespace detail | |
{ | |
class wrapper_base; | |
// The result of calling a method. | |
class method_result | |
{ | |
private: | |
friend class boost::python::override; | |
explicit method_result(PyObject* x) | |
: m_obj(x) | |
{} | |
public: | |
template <class T> | |
operator T() | |
{ | |
converter::return_from_python<T> converter; | |
return converter(m_obj.release()); | |
} | |
# if BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(140050215)) | |
template <class T> | |
operator T*() | |
{ | |
converter::return_from_python<T*> converter; | |
return converter(m_obj.release()); | |
} | |
# endif | |
# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) || BOOST_WORKAROUND(BOOST_INTEL_WIN, >= 900) | |
// No operator T& | |
# else | |
template <class T> | |
operator T&() const | |
{ | |
converter::return_from_python<T&> converter; | |
return converter(const_cast<handle<>&>(m_obj).release()); | |
} | |
# endif | |
template <class T> | |
T as(type<T>* = 0) | |
{ | |
converter::return_from_python<T> converter; | |
return converter(m_obj.release()); | |
} | |
template <class T> | |
T unchecked(type<T>* = 0) | |
{ | |
return extract<T>(m_obj)(); | |
} | |
private: | |
mutable handle<> m_obj; | |
}; | |
} | |
class override : public object | |
{ | |
private: | |
friend class detail::wrapper_base; | |
override(handle<> x) | |
: object(x) | |
{} | |
public: | |
detail::method_result | |
operator()() const | |
{ | |
detail::method_result x( | |
PyEval_CallFunction( | |
this->ptr() | |
, const_cast<char*>("()") | |
)); | |
return x; | |
} | |
# define BOOST_PYTHON_fast_arg_to_python_get(z, n, _) \ | |
, converter::arg_to_python<A##n>(a##n).get() | |
# define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, <boost/python/override.hpp>)) | |
# include BOOST_PP_ITERATE() | |
# undef BOOST_PYTHON_fast_arg_to_python_get | |
}; | |
}} // namespace boost::python | |
#endif // OVERRIDE_DWA2004721_HPP | |
#else | |
# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ | |
&& BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) | |
# line BOOST_PP_LINE(__LINE__, override.hpp) | |
# endif | |
# define N BOOST_PP_ITERATION() | |
template < | |
BOOST_PP_ENUM_PARAMS_Z(1, N, class A) | |
> | |
detail::method_result | |
operator()( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a) ) const | |
{ | |
detail::method_result x( | |
PyEval_CallFunction( | |
this->ptr() | |
, const_cast<char*>("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") | |
BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_fast_arg_to_python_get, nil) | |
)); | |
return x; | |
} | |
# undef N | |
#endif |