123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #ifndef boost_python_converter_shared_ptr_from_python_hpp_
- #define boost_python_converter_shared_ptr_from_python_hpp_
- #include <boost/python/handle.hpp>
- #include <boost/python/converter/shared_ptr_deleter.hpp>
- #include <boost/python/converter/from_python.hpp>
- #include <boost/python/converter/rvalue_from_python_data.hpp>
- #include <boost/python/converter/registered.hpp>
- #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
- # include <boost/python/converter/pytype_function.hpp>
- #endif
- #include <boost/shared_ptr.hpp>
- #include <memory>
- namespace boost { namespace python { namespace converter {
- template <class T, template <typename> class SP>
- struct shared_ptr_from_python
- {
- shared_ptr_from_python()
- {
- converter::registry::insert(&convertible, &construct, type_id<SP<T> >()
- #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
- , &converter::expected_from_python_type_direct<T>::get_pytype
- #endif
- );
- }
- private:
- static void* convertible(PyObject* p)
- {
- if (p == Py_None)
- return p;
-
- return converter::get_lvalue_from_python(p, registered<T>::converters);
- }
-
- static void construct(PyObject* source, rvalue_from_python_stage1_data* data)
- {
- void* const storage = ((converter::rvalue_from_python_storage<SP<T> >*)data)->storage.bytes;
-
- if (data->convertible == source)
- new (storage) SP<T>();
- else
- {
- void *const storage = ((converter::rvalue_from_python_storage<SP<T> >*)data)->storage.bytes;
-
- if (data->convertible == source)
- new (storage) SP<T>();
- else
- {
- SP<void> hold_convertible_ref_count((void*)0, shared_ptr_deleter(handle<>(borrowed(source))) );
-
- new (storage) SP<T>(hold_convertible_ref_count, static_cast<T*>(data->convertible));
- }
- }
- data->convertible = storage;
- }
- };
- }}}
- #endif
|