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_INSTANCE_DWA200296_HPP Chris@16: # define MAKE_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: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace objects { Chris@16: Chris@16: template Chris@16: struct make_instance_impl Chris@16: { Chris@16: typedef objects::instance instance_t; Chris@16: Chris@16: template Chris@16: static inline PyObject* execute(Arg& x) Chris@16: { Chris@16: BOOST_MPL_ASSERT((mpl::or_, is_union >)); Chris@16: Chris@16: PyTypeObject* type = Derived::get_class_object(x); Chris@16: Chris@16: if (type == 0) Chris@16: return python::detail::none(); Chris@16: Chris@16: PyObject* raw_result = type->tp_alloc( Chris@16: type, objects::additional_instance_size::value); Chris@16: Chris@16: if (raw_result != 0) Chris@16: { Chris@16: python::detail::decref_guard protect(raw_result); Chris@16: Chris@16: instance_t* instance = (instance_t*)raw_result; Chris@16: Chris@16: // construct the new C++ object and install the pointer Chris@16: // in the Python object. Chris@16: Derived::construct(&instance->storage, (PyObject*)instance, x)->install(raw_result); Chris@16: Chris@16: // Note the position of the internally-stored Holder, Chris@16: // for the sake of destruction Chris@16: Py_SIZE(instance) = offsetof(instance_t, storage); Chris@16: Chris@16: // Release ownership of the python object Chris@16: protect.cancel(); Chris@16: } Chris@16: return raw_result; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct make_instance Chris@16: : make_instance_impl > Chris@16: { Chris@16: template Chris@16: static inline PyTypeObject* get_class_object(U&) Chris@16: { Chris@16: return converter::registered::converters.get_class_object(); Chris@16: } Chris@16: Chris@16: static inline Holder* construct(void* storage, PyObject* instance, reference_wrapper x) Chris@16: { Chris@16: return new (storage) Holder(instance, x); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: }}} // namespace boost::python::object Chris@16: Chris@16: #endif // MAKE_INSTANCE_DWA200296_HPP