Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef MAKE_PTR_INSTANCE_DWA200296_HPP Chris@16: # define MAKE_PTR_INSTANCE_DWA200296_HPP Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace objects { Chris@16: Chris@16: template Chris@16: struct make_ptr_instance Chris@16: : make_instance_impl > Chris@16: { Chris@16: template Chris@16: static inline Holder* construct(void* storage, PyObject*, Arg& x) Chris@16: { Chris@16: return new (storage) Holder(x); Chris@16: } Chris@16: Chris@16: template Chris@16: static inline PyTypeObject* get_class_object(Ptr const& x) Chris@16: { Chris@16: return get_class_object_impl(get_pointer(x)); Chris@16: } Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: static inline PyTypeObject const* get_pytype() Chris@16: { Chris@16: return converter::registered::converters.get_class_object(); Chris@16: } Chris@16: #endif Chris@16: private: Chris@16: template Chris@16: static inline PyTypeObject* get_class_object_impl(U const volatile* p) Chris@16: { Chris@16: if (p == 0) Chris@16: return 0; // means "return None". Chris@16: Chris@16: PyTypeObject* derived = get_derived_class_object( Chris@16: BOOST_DEDUCED_TYPENAME is_polymorphic::type(), p); Chris@16: Chris@16: if (derived) Chris@16: return derived; Chris@16: return converter::registered::converters.get_class_object(); Chris@16: } Chris@16: Chris@16: template Chris@16: static inline PyTypeObject* get_derived_class_object(mpl::true_, U const volatile* x) Chris@16: { Chris@16: converter::registration const* r = converter::registry::query( Chris@16: type_info(typeid(*get_pointer(x))) Chris@16: ); Chris@16: return r ? r->m_class_object : 0; Chris@16: } Chris@16: Chris@16: template Chris@16: static inline PyTypeObject* get_derived_class_object(mpl::false_, U*) Chris@16: { Chris@16: return 0; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: }}} // namespace boost::python::object Chris@16: Chris@16: #endif // MAKE_PTR_INSTANCE_DWA200296_HPP