1 // Copyright David Abrahams 2004. Distributed under the Boost
2 // Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4 #ifndef WRAPPER_BASE_DWA2004722_HPP
5 # define WRAPPER_BASE_DWA2004722_HPP
7 # include <boost/python/detail/prefix.hpp>
8 # include <boost/type_traits/is_polymorphic.hpp>
9 # include <boost/mpl/bool.hpp>
11 namespace boost { namespace python {
17 class BOOST_PYTHON_DECL_FORWARD wrapper_base;
19 namespace wrapper_base_ // ADL disabler
21 inline PyObject* get_owner(wrapper_base const volatile& w);
24 owner_impl(void const volatile* /*x*/, mpl::false_)
31 owner_impl(T const volatile* x, mpl::true_);
35 owner(T const volatile* x)
37 return wrapper_base_::owner_impl(x,is_polymorphic<T>());
41 class BOOST_PYTHON_DECL wrapper_base
43 friend void initialize_wrapper(PyObject* self, wrapper_base* w);
44 friend PyObject* wrapper_base_::get_owner(wrapper_base const volatile& w);
46 wrapper_base() : m_self(0) {}
48 override get_override(
49 char const* name, PyTypeObject* class_object) const;
58 namespace wrapper_base_ // ADL disabler
62 owner_impl(T const volatile* x, mpl::true_)
64 if (wrapper_base const volatile* w = dynamic_cast<wrapper_base const volatile*>(x))
66 return wrapper_base_::get_owner(*w);
71 inline PyObject* get_owner(wrapper_base const volatile& w)
77 inline void initialize_wrapper(PyObject* self, wrapper_base* w)
82 inline void initialize_wrapper(PyObject* /*self*/, ...) {}
88 }} // namespace boost::python
90 #endif // WRAPPER_BASE_DWA2004722_HPP