133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright David Abrahams 2002,  Nikolay Mladenov 2007. | ||
|  | // Distributed under the Boost Software License, Version 1.0. (See | ||
|  | // accompanying file LICENSE_1_0.txt or copy at | ||
|  | // http://www.boost.org/LICENSE_1_0.txt) | ||
|  | #ifndef WRAP_PYTYPE_NM20070606_HPP | ||
|  | # define WRAP_PYTYPE_NM20070606_HPP | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp> | ||
|  | # include <boost/python/converter/registered.hpp> | ||
|  | #  include <boost/python/detail/unwind_type.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace boost { namespace python { | ||
|  | 
 | ||
|  | namespace converter | ||
|  | { | ||
|  | template <PyTypeObject const* python_type> | ||
|  | struct wrap_pytype | ||
|  | { | ||
|  |     static PyTypeObject const* get_pytype() | ||
|  |     { | ||
|  |         return python_type; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | typedef PyTypeObject const* (*pytype_function)(); | ||
|  | 
 | ||
|  | #ifndef BOOST_PYTHON_NO_PY_SIGNATURES | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace detail | ||
|  | { | ||
|  | struct unwind_type_id_helper{ | ||
|  |     typedef python::type_info result_type; | ||
|  |     template <class U> | ||
|  |     static result_type execute(U* ){ | ||
|  |         return python::type_id<U>(); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | inline python::type_info unwind_type_id_(boost::type<T>* = 0, mpl::false_ * =0) | ||
|  | { | ||
|  |     return boost::python::detail::unwind_type<unwind_type_id_helper, T> (); | ||
|  | } | ||
|  | 
 | ||
|  | inline python::type_info unwind_type_id_(boost::type<void>* = 0, mpl::true_* =0) | ||
|  | { | ||
|  |     return type_id<void>(); | ||
|  | } | ||
|  | 
 | ||
|  | template <class T> | ||
|  | inline python::type_info unwind_type_id(boost::type<T>* p= 0) | ||
|  | { | ||
|  |     return unwind_type_id_(p, (mpl::bool_<boost::is_void<T>::value >*)0 ); | ||
|  | } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct expected_pytype_for_arg | ||
|  | { | ||
|  |     static PyTypeObject const *get_pytype() | ||
|  |     { | ||
|  |         const converter::registration *r=converter::registry::query( | ||
|  |             detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 ) | ||
|  |             ); | ||
|  |         return r ? r->expected_from_python_type(): 0; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct registered_pytype | ||
|  | { | ||
|  |     static PyTypeObject const *get_pytype() | ||
|  |     { | ||
|  |         const converter::registration *r=converter::registry::query( | ||
|  |             detail::unwind_type_id_((boost::type<T>*) 0, (mpl::bool_<boost::is_void<T>::value >*)0 ) | ||
|  |             ); | ||
|  |         return r ? r->m_class_object: 0; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct registered_pytype_direct | ||
|  | { | ||
|  |     static PyTypeObject const* get_pytype() | ||
|  |     { | ||
|  |         return registered<T>::converters.m_class_object; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct expected_from_python_type : expected_pytype_for_arg<T>{}; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct expected_from_python_type_direct | ||
|  | { | ||
|  |     static PyTypeObject const* get_pytype() | ||
|  |     { | ||
|  |         return registered<T>::converters.expected_from_python_type(); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct to_python_target_type | ||
|  | { | ||
|  |     static PyTypeObject const *get_pytype() | ||
|  |     { | ||
|  |         const converter::registration *r=converter::registry::query( | ||
|  |             detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 ) | ||
|  |             ); | ||
|  |         return r ? r->to_python_target_type(): 0; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct to_python_target_type_direct | ||
|  | { | ||
|  |     static PyTypeObject const *get_pytype() | ||
|  |     { | ||
|  |         return registered<T>::converters.to_python_target_type(); | ||
|  |     } | ||
|  | }; | ||
|  | #endif | ||
|  | 
 | ||
|  | }}} // namespace boost::python | ||
|  | 
 | ||
|  | #endif // WRAP_PYTYPE_NM20070606_HPP |