1 // Copyright David Abrahams 2002.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 #ifndef EXTRACT_DWA200265_HPP
6 # define EXTRACT_DWA200265_HPP
8 # include <boost/python/detail/prefix.hpp>
10 # include <boost/python/converter/object_manager.hpp>
11 # include <boost/python/converter/from_python.hpp>
12 # include <boost/python/converter/rvalue_from_python_data.hpp>
13 # include <boost/python/converter/registered.hpp>
14 # include <boost/python/converter/registered_pointee.hpp>
16 # include <boost/python/object_core.hpp>
17 # include <boost/python/refcount.hpp>
19 # include <boost/python/detail/copy_ctor_mutates_rhs.hpp>
20 # include <boost/python/detail/void_ptr.hpp>
21 # include <boost/python/detail/void_return.hpp>
22 # include <boost/call_traits.hpp>
24 #if BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 900)
25 # define BOOST_EXTRACT_WORKAROUND ()
27 # define BOOST_EXTRACT_WORKAROUND
30 namespace boost { namespace python {
40 struct extract_pointer
42 typedef Ptr result_type;
43 extract_pointer(PyObject*);
46 Ptr operator()() const;
54 struct extract_reference
56 typedef Ref result_type;
57 extract_reference(PyObject*);
60 Ref operator()() const;
68 struct extract_rvalue : private noncopyable
70 typedef typename mpl::if_<
71 python::detail::copy_ctor_mutates_rhs<T>
73 , typename call_traits<T>::param_type
76 extract_rvalue(PyObject*);
79 result_type operator()() const;
82 mutable rvalue_from_python_data<T> m_data;
86 struct extract_object_manager
88 typedef T result_type;
89 extract_object_manager(PyObject*);
92 result_type operator()() const;
100 BOOST_STATIC_CONSTANT(
101 bool, obj_mgr = is_object_manager<T>::value);
103 BOOST_STATIC_CONSTANT(
104 bool, ptr = is_pointer<T>::value);
106 BOOST_STATIC_CONSTANT(
107 bool, ref = is_reference<T>::value);
109 typedef typename mpl::if_c<
111 , extract_object_manager<T>
112 , typename mpl::if_c<
115 , typename mpl::if_c<
117 , extract_reference<T>
127 : converter::select_extract<T>::type
130 typedef typename converter::select_extract<T>::type base;
132 typedef typename base::result_type result_type;
134 operator result_type() const
140 extract(api::object const&);
147 inline extract<T>::extract(PyObject* o)
153 inline extract<T>::extract(api::object const& o)
161 inline extract_rvalue<T>::extract_rvalue(PyObject* x)
164 (rvalue_from_python_stage1)(x, registered<T>::converters)
171 extract_rvalue<T>::check() const
173 return m_data.stage1.convertible;
177 inline typename extract_rvalue<T>::result_type
178 extract_rvalue<T>::operator()() const
181 // Only do the stage2 conversion once
182 m_data.stage1.convertible == m_data.storage.bytes
183 ? m_data.storage.bytes
184 : (rvalue_from_python_stage2)(m_source, m_data.stage1, registered<T>::converters)
189 inline extract_reference<Ref>::extract_reference(PyObject* obj)
192 (get_lvalue_from_python)(obj, registered<Ref>::converters)
198 inline bool extract_reference<Ref>::check() const
200 return m_result != 0;
204 inline Ref extract_reference<Ref>::operator()() const
207 (throw_no_reference_from_python)(m_source, registered<Ref>::converters);
209 return python::detail::void_ptr_to_reference(m_result, (Ref(*)())0);
213 inline extract_pointer<Ptr>::extract_pointer(PyObject* obj)
216 obj == Py_None ? 0 : (get_lvalue_from_python)(obj, registered_pointee<Ptr>::converters)
222 inline bool extract_pointer<Ptr>::check() const
224 return m_source == Py_None || m_result != 0;
228 inline Ptr extract_pointer<Ptr>::operator()() const
230 if (m_result == 0 && m_source != Py_None)
231 (throw_no_pointer_from_python)(m_source, registered_pointee<Ptr>::converters);
233 return Ptr(m_result);
237 inline extract_object_manager<T>::extract_object_manager(PyObject* obj)
243 inline bool extract_object_manager<T>::check() const
245 return object_manager_traits<T>::check(m_source);
249 inline T extract_object_manager<T>::operator()() const
252 object_manager_traits<T>::adopt(python::incref(m_source))
257 }} // namespace boost::python::converter
259 #endif // EXTRACT_DWA200265_HPP