• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright David Abrahams 2003.
2 // Copyright Stefan Seefeld 2016.
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef boost_python_converter_shared_ptr_to_python_hpp_
8 #define boost_python_converter_shared_ptr_to_python_hpp_
9 
10 #include <boost/python/refcount.hpp>
11 #include <boost/python/converter/shared_ptr_deleter.hpp>
12 #include <boost/shared_ptr.hpp>
13 #include <boost/get_pointer.hpp>
14 
15 namespace boost { namespace python { namespace converter {
16 
17 template <class T>
shared_ptr_to_python(shared_ptr<T> const & x)18 PyObject* shared_ptr_to_python(shared_ptr<T> const& x)
19 {
20     if (!x)
21         return python::detail::none();
22     else if (shared_ptr_deleter* d = boost::get_deleter<shared_ptr_deleter>(x))
23         return incref( get_pointer( d->owner ) );
24     else
25         return converter::registered<shared_ptr<T> const&>::converters.to_python(&x);
26 }
27 
28 #if !defined(BOOST_NO_CXX11_SMART_PTR)
29 template <class T>
shared_ptr_to_python(std::shared_ptr<T> const & x)30 PyObject* shared_ptr_to_python(std::shared_ptr<T> const& x)
31 {
32   if (!x)
33     return python::detail::none();
34   else if (shared_ptr_deleter* d = std::get_deleter<shared_ptr_deleter>(x))
35     return incref(get_pointer(d->owner));
36   else
37     return converter::registered<std::shared_ptr<T> const&>::converters.to_python(&x);
38 }
39 #endif
40 
41 }}} // namespace boost::python::converter
42 
43 #endif
44