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