annotate DEPENDENCIES/generic/include/boost/python/to_python_indirect.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright David Abrahams 2002.
Chris@16 2 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 3 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 4 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5 #ifndef TO_PYTHON_INDIRECT_DWA200221_HPP
Chris@16 6 # define TO_PYTHON_INDIRECT_DWA200221_HPP
Chris@16 7
Chris@16 8 # include <boost/python/detail/prefix.hpp>
Chris@16 9
Chris@16 10 # include <boost/python/object/pointer_holder.hpp>
Chris@16 11 # include <boost/python/object/make_ptr_instance.hpp>
Chris@16 12
Chris@16 13 # include <boost/python/detail/none.hpp>
Chris@16 14
Chris@16 15 #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
Chris@16 16 # include <boost/python/converter/pytype_function.hpp>
Chris@16 17 #endif
Chris@16 18
Chris@16 19 # include <boost/python/refcount.hpp>
Chris@16 20
Chris@16 21 # include <boost/type_traits/is_pointer.hpp>
Chris@16 22 # include <boost/type_traits/is_polymorphic.hpp>
Chris@16 23
Chris@16 24 # include <boost/mpl/bool.hpp>
Chris@16 25
Chris@16 26 # if defined(__ICL) && __ICL < 600
Chris@16 27 # include <boost/shared_ptr.hpp>
Chris@16 28 # else
Chris@16 29 # include <memory>
Chris@16 30 # endif
Chris@16 31
Chris@16 32 namespace boost { namespace python {
Chris@16 33
Chris@16 34 template <class T, class MakeHolder>
Chris@16 35 struct to_python_indirect
Chris@16 36 {
Chris@16 37 template <class U>
Chris@16 38 inline PyObject*
Chris@16 39 operator()(U const& ref) const
Chris@16 40 {
Chris@16 41 return this->execute(const_cast<U&>(ref), is_pointer<U>());
Chris@16 42 }
Chris@16 43 #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
Chris@16 44 inline PyTypeObject const*
Chris@16 45 get_pytype()const
Chris@16 46 {
Chris@16 47 return converter::registered_pytype<T>::get_pytype();
Chris@16 48 }
Chris@16 49 #endif
Chris@16 50 private:
Chris@16 51 template <class U>
Chris@16 52 inline PyObject* execute(U* ptr, mpl::true_) const
Chris@16 53 {
Chris@16 54 // No special NULL treatment for references
Chris@16 55 if (ptr == 0)
Chris@16 56 return python::detail::none();
Chris@16 57 else
Chris@16 58 return this->execute(*ptr, mpl::false_());
Chris@16 59 }
Chris@16 60
Chris@16 61 template <class U>
Chris@16 62 inline PyObject* execute(U const& x, mpl::false_) const
Chris@16 63 {
Chris@16 64 U* const p = &const_cast<U&>(x);
Chris@16 65 if (is_polymorphic<U>::value)
Chris@16 66 {
Chris@16 67 if (PyObject* o = detail::wrapper_base_::owner(p))
Chris@16 68 return incref(o);
Chris@16 69 }
Chris@16 70 return MakeHolder::execute(p);
Chris@16 71 }
Chris@16 72 };
Chris@16 73
Chris@16 74 //
Chris@16 75 // implementations
Chris@16 76 //
Chris@16 77 namespace detail
Chris@16 78 {
Chris@16 79 struct make_owning_holder
Chris@16 80 {
Chris@16 81 template <class T>
Chris@16 82 static PyObject* execute(T* p)
Chris@16 83 {
Chris@16 84 // can't use auto_ptr with Intel 5 and VC6 Dinkum library
Chris@16 85 // for some reason. We get link errors against the auto_ptr
Chris@16 86 // copy constructor.
Chris@16 87 # if defined(__ICL) && __ICL < 600
Chris@16 88 typedef boost::shared_ptr<T> smart_pointer;
Chris@16 89 # else
Chris@16 90 typedef std::auto_ptr<T> smart_pointer;
Chris@16 91 # endif
Chris@16 92 typedef objects::pointer_holder<smart_pointer, T> holder_t;
Chris@16 93
Chris@16 94 smart_pointer ptr(const_cast<T*>(p));
Chris@16 95 return objects::make_ptr_instance<T, holder_t>::execute(ptr);
Chris@16 96 }
Chris@16 97 };
Chris@16 98
Chris@16 99 struct make_reference_holder
Chris@16 100 {
Chris@16 101 template <class T>
Chris@16 102 static PyObject* execute(T* p)
Chris@16 103 {
Chris@16 104 typedef objects::pointer_holder<T*, T> holder_t;
Chris@16 105 T* q = const_cast<T*>(p);
Chris@16 106 return objects::make_ptr_instance<T, holder_t>::execute(q);
Chris@16 107 }
Chris@16 108 };
Chris@16 109 }
Chris@16 110
Chris@16 111 }} // namespace boost::python
Chris@16 112
Chris@16 113 #endif // TO_PYTHON_INDIRECT_DWA200221_HPP