145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #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.get())();
 | |
|       }
 | |
|    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 
 | 
