91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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 WRAPPER_BASE_DWA2004722_HPP | ||
|  | # define WRAPPER_BASE_DWA2004722_HPP | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp> | ||
|  | # include <boost/type_traits/is_polymorphic.hpp> | ||
|  | # include <boost/mpl/bool.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace python { | ||
|  | 
 | ||
|  | class override; | ||
|  | 
 | ||
|  | namespace detail | ||
|  | { | ||
|  |   class BOOST_PYTHON_DECL_FORWARD wrapper_base; | ||
|  |    | ||
|  |   namespace wrapper_base_ // ADL disabler | ||
|  |   { | ||
|  |     inline PyObject* get_owner(wrapper_base const volatile& w); | ||
|  | 
 | ||
|  |     inline PyObject* | ||
|  |     owner_impl(void const volatile* /*x*/, mpl::false_) | ||
|  |     { | ||
|  |         return 0; | ||
|  |     } | ||
|  |      | ||
|  |     template <class T> | ||
|  |     inline PyObject* | ||
|  |     owner_impl(T const volatile* x, mpl::true_); | ||
|  |      | ||
|  |     template <class T> | ||
|  |     inline PyObject* | ||
|  |     owner(T const volatile* x) | ||
|  |     { | ||
|  |         return wrapper_base_::owner_impl(x,is_polymorphic<T>()); | ||
|  |     } | ||
|  |   } | ||
|  |    | ||
|  |   class BOOST_PYTHON_DECL wrapper_base | ||
|  |   { | ||
|  |       friend void initialize_wrapper(PyObject* self, wrapper_base* w); | ||
|  |       friend PyObject* wrapper_base_::get_owner(wrapper_base const volatile& w); | ||
|  |    protected: | ||
|  |       wrapper_base() : m_self(0) {} | ||
|  |            | ||
|  |       override get_override( | ||
|  |           char const* name, PyTypeObject* class_object) const; | ||
|  | 
 | ||
|  |    private: | ||
|  |       void detach(); | ||
|  |        | ||
|  |    private: | ||
|  |       PyObject* m_self; | ||
|  |   }; | ||
|  | 
 | ||
|  |   namespace wrapper_base_ // ADL disabler | ||
|  |   { | ||
|  |     template <class T> | ||
|  |     inline PyObject* | ||
|  |     owner_impl(T const volatile* x, mpl::true_) | ||
|  |     { | ||
|  |         if (wrapper_base const volatile* w = dynamic_cast<wrapper_base const volatile*>(x)) | ||
|  |         { | ||
|  |             return wrapper_base_::get_owner(*w); | ||
|  |         } | ||
|  |         return 0; | ||
|  |     } | ||
|  |      | ||
|  |     inline PyObject* get_owner(wrapper_base const volatile& w) | ||
|  |     { | ||
|  |         return w.m_self; | ||
|  |     } | ||
|  |   } | ||
|  |    | ||
|  |   inline void initialize_wrapper(PyObject* self, wrapper_base* w) | ||
|  |   { | ||
|  |       w->m_self = self; | ||
|  |   } | ||
|  | 
 | ||
|  |   inline void initialize_wrapper(PyObject* /*self*/, ...) {} | ||
|  | 
 | ||
|  |    | ||
|  |    | ||
|  | } // namespace detail | ||
|  | 
 | ||
|  | }} // namespace boost::python | ||
|  | 
 | ||
|  | #endif // WRAPPER_BASE_DWA2004722_HPP |