annotate DEPENDENCIES/generic/include/boost/python/handle.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 HANDLE_DWA200269_HPP
Chris@16 6 # define HANDLE_DWA200269_HPP
Chris@16 7
Chris@16 8 # include <boost/python/detail/prefix.hpp>
Chris@16 9
Chris@16 10 # include <boost/python/cast.hpp>
Chris@16 11 # include <boost/python/errors.hpp>
Chris@16 12 # include <boost/python/borrowed.hpp>
Chris@16 13 # include <boost/python/handle_fwd.hpp>
Chris@16 14 # include <boost/python/refcount.hpp>
Chris@16 15 # include <boost/python/tag.hpp>
Chris@16 16 # include <boost/python/detail/raw_pyobject.hpp>
Chris@16 17
Chris@16 18 namespace boost { namespace python {
Chris@16 19
Chris@16 20 template <class T> struct null_ok;
Chris@16 21
Chris@16 22 template <class T>
Chris@16 23 inline null_ok<T>* allow_null(T* p)
Chris@16 24 {
Chris@16 25 return (null_ok<T>*)p;
Chris@16 26 }
Chris@16 27
Chris@16 28 namespace detail
Chris@16 29 {
Chris@16 30 template <class T>
Chris@16 31 inline T* manage_ptr(detail::borrowed<null_ok<T> >* p, int)
Chris@16 32 {
Chris@16 33 return python::xincref((T*)p);
Chris@16 34 }
Chris@16 35
Chris@16 36 template <class T>
Chris@16 37 inline T* manage_ptr(null_ok<detail::borrowed<T> >* p, int)
Chris@16 38 {
Chris@16 39 return python::xincref((T*)p);
Chris@16 40 }
Chris@16 41
Chris@16 42 template <class T>
Chris@16 43 inline T* manage_ptr(detail::borrowed<T>* p, long)
Chris@16 44 {
Chris@16 45 return python::incref(expect_non_null((T*)p));
Chris@16 46 }
Chris@16 47
Chris@16 48 template <class T>
Chris@16 49 inline T* manage_ptr(null_ok<T>* p, long)
Chris@16 50 {
Chris@16 51 return (T*)p;
Chris@16 52 }
Chris@16 53
Chris@16 54 template <class T>
Chris@16 55 inline T* manage_ptr(T* p, ...)
Chris@16 56 {
Chris@16 57 return expect_non_null(p);
Chris@16 58 }
Chris@16 59 }
Chris@16 60
Chris@16 61 template <class T>
Chris@16 62 class handle
Chris@16 63 {
Chris@16 64 typedef T* (handle::* bool_type )() const;
Chris@16 65
Chris@16 66 public: // types
Chris@16 67 typedef T element_type;
Chris@16 68
Chris@16 69 public: // member functions
Chris@16 70 handle();
Chris@16 71 ~handle();
Chris@16 72
Chris@16 73 template <class Y>
Chris@16 74 explicit handle(Y* p)
Chris@16 75 : m_p(
Chris@16 76 python::upcast<T>(
Chris@16 77 detail::manage_ptr(p, 0)
Chris@16 78 )
Chris@16 79 )
Chris@16 80 {
Chris@16 81 }
Chris@16 82
Chris@16 83 handle& operator=(handle const& r)
Chris@16 84 {
Chris@16 85 python::xdecref(m_p);
Chris@16 86 m_p = python::xincref(r.m_p);
Chris@16 87 return *this;
Chris@16 88 }
Chris@16 89
Chris@16 90 #if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1300)
Chris@16 91
Chris@16 92 template<typename Y>
Chris@16 93 handle& operator=(handle<Y> const & r) // never throws
Chris@16 94 {
Chris@16 95 python::xdecref(m_p);
Chris@16 96 m_p = python::xincref(python::upcast<T>(r.get()));
Chris@16 97 return *this;
Chris@16 98 }
Chris@16 99
Chris@16 100 #endif
Chris@16 101
Chris@16 102 template <typename Y>
Chris@16 103 handle(handle<Y> const& r)
Chris@16 104 : m_p(python::xincref(python::upcast<T>(r.get())))
Chris@16 105 {
Chris@16 106 }
Chris@16 107
Chris@16 108 handle(handle const& r)
Chris@16 109 : m_p(python::xincref(r.m_p))
Chris@16 110 {
Chris@16 111 }
Chris@16 112
Chris@16 113 T* operator-> () const;
Chris@16 114 T& operator* () const;
Chris@16 115 T* get() const;
Chris@16 116 T* release();
Chris@16 117 void reset();
Chris@16 118
Chris@16 119 operator bool_type() const // never throws
Chris@16 120 {
Chris@16 121 return m_p ? &handle<T>::get : 0;
Chris@16 122 }
Chris@16 123 bool operator! () const; // never throws
Chris@16 124
Chris@16 125 public: // implementation details -- do not touch
Chris@16 126 // Defining this in the class body suppresses a VC7 link failure
Chris@16 127 inline handle(detail::borrowed_reference x)
Chris@16 128 : m_p(
Chris@16 129 python::incref(
Chris@16 130 downcast<T>((PyObject*)x)
Chris@16 131 ))
Chris@16 132 {
Chris@16 133 }
Chris@16 134
Chris@16 135 private: // data members
Chris@16 136 T* m_p;
Chris@16 137 };
Chris@16 138
Chris@16 139 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
Chris@16 140 } // namespace python
Chris@16 141 #endif
Chris@16 142
Chris@16 143 template<class T> inline T * get_pointer(python::handle<T> const & p)
Chris@16 144 {
Chris@16 145 return p.get();
Chris@16 146 }
Chris@16 147
Chris@16 148 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
Chris@16 149 namespace python {
Chris@16 150 #else
Chris@16 151
Chris@16 152 // We don't want get_pointer above to hide the others
Chris@16 153 using boost::get_pointer;
Chris@16 154
Chris@16 155 #endif
Chris@16 156
Chris@16 157 typedef handle<PyTypeObject> type_handle;
Chris@16 158
Chris@16 159 //
Chris@16 160 // Compile-time introspection
Chris@16 161 //
Chris@16 162 # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 163 template<typename T>
Chris@16 164 class is_handle
Chris@16 165 {
Chris@16 166 public:
Chris@16 167 BOOST_STATIC_CONSTANT(bool, value = false);
Chris@16 168 };
Chris@16 169
Chris@16 170 template<typename T>
Chris@16 171 class is_handle<handle<T> >
Chris@16 172 {
Chris@16 173 public:
Chris@16 174 BOOST_STATIC_CONSTANT(bool, value = true);
Chris@16 175 };
Chris@16 176 # else
Chris@16 177 namespace detail
Chris@16 178 {
Chris@16 179 typedef char (&yes_handle_t)[1];
Chris@16 180 typedef char (&no_handle_t)[2];
Chris@16 181
Chris@16 182 no_handle_t is_handle_test(...);
Chris@16 183
Chris@16 184 template<typename T>
Chris@16 185 yes_handle_t is_handle_test(boost::type< handle<T> >);
Chris@16 186 }
Chris@16 187
Chris@16 188 template<typename T>
Chris@16 189 class is_handle
Chris@16 190 {
Chris@16 191 public:
Chris@16 192 BOOST_STATIC_CONSTANT(
Chris@16 193 bool, value = (
Chris@16 194 sizeof(detail::is_handle_test(boost::type<T>()))
Chris@16 195 == sizeof(detail::yes_handle_t)));
Chris@16 196 };
Chris@16 197 # endif
Chris@16 198
Chris@16 199 //
Chris@16 200 // implementations
Chris@16 201 //
Chris@16 202 template <class T>
Chris@16 203 inline handle<T>::handle()
Chris@16 204 : m_p(0)
Chris@16 205 {
Chris@16 206 }
Chris@16 207
Chris@16 208 template <class T>
Chris@16 209 inline handle<T>::~handle()
Chris@16 210 {
Chris@16 211 python::xdecref(m_p);
Chris@16 212 }
Chris@16 213
Chris@16 214 template <class T>
Chris@16 215 inline T* handle<T>::operator->() const
Chris@16 216 {
Chris@16 217 return m_p;
Chris@16 218 }
Chris@16 219
Chris@16 220 template <class T>
Chris@16 221 inline T& handle<T>::operator*() const
Chris@16 222 {
Chris@16 223 return *m_p;
Chris@16 224 }
Chris@16 225
Chris@16 226 template <class T>
Chris@16 227 inline T* handle<T>::get() const
Chris@16 228 {
Chris@16 229 return m_p;
Chris@16 230 }
Chris@16 231
Chris@16 232 template <class T>
Chris@16 233 inline bool handle<T>::operator!() const
Chris@16 234 {
Chris@16 235 return m_p == 0;
Chris@16 236 }
Chris@16 237
Chris@16 238 template <class T>
Chris@16 239 inline T* handle<T>::release()
Chris@16 240 {
Chris@16 241 T* result = m_p;
Chris@16 242 m_p = 0;
Chris@16 243 return result;
Chris@16 244 }
Chris@16 245
Chris@16 246 template <class T>
Chris@16 247 inline void handle<T>::reset()
Chris@16 248 {
Chris@16 249 python::xdecref(m_p);
Chris@16 250 m_p = 0;
Chris@16 251 }
Chris@16 252
Chris@16 253 // Because get_managed_object must return a non-null PyObject*, we
Chris@16 254 // return Py_None if the handle is null.
Chris@16 255 template <class T>
Chris@16 256 inline PyObject* get_managed_object(handle<T> const& h, tag_t)
Chris@16 257 {
Chris@16 258 return h.get() ? python::upcast<PyObject>(h.get()) : Py_None;
Chris@16 259 }
Chris@16 260
Chris@16 261 }} // namespace boost::python
Chris@16 262
Chris@16 263
Chris@16 264 #endif // HANDLE_DWA200269_HPP