95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright David Abrahams 2002. | ||
|  | // 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 TO_PYTHON_CONVERTER_DWA200221_HPP | ||
|  | # define TO_PYTHON_CONVERTER_DWA200221_HPP | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp> | ||
|  | 
 | ||
|  | # include <boost/python/converter/registry.hpp> | ||
|  | # include <boost/python/converter/as_to_python_function.hpp> | ||
|  | #ifndef BOOST_PYTHON_NO_PY_SIGNATURES | ||
|  | # include <boost/python/converter/pytype_function.hpp> | ||
|  | #endif | ||
|  | # include <boost/python/type_id.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace python {  | ||
|  | 
 | ||
|  | #if 0 //get_pytype member detection | ||
|  | namespace detail | ||
|  | { | ||
|  |     typedef char yes_type; | ||
|  |     typedef struct {char a[2]; } no_type; | ||
|  |     template<PyTypeObject const * (*f)()> struct test_get_pytype1 { }; | ||
|  |     template<PyTypeObject * (*f)()>          struct test_get_pytype2 { }; | ||
|  | 
 | ||
|  |     template<class T> yes_type tester(test_get_pytype1<&T::get_pytype>*); | ||
|  | 
 | ||
|  |     template<class T> yes_type tester(test_get_pytype2<&T::get_pytype>*); | ||
|  | 
 | ||
|  |     template<class T> no_type tester(...); | ||
|  | 
 | ||
|  |     template<class T> | ||
|  |     struct test_get_pytype_base   | ||
|  |     { | ||
|  |         BOOST_STATIC_CONSTANT(bool, value= (sizeof(detail::tester<T>(0)) == sizeof(yes_type))); | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class T> | ||
|  |     struct test_get_pytype : boost::mpl::bool_<test_get_pytype_base<T>::value>  | ||
|  |     { | ||
|  |     }; | ||
|  | 
 | ||
|  | } | ||
|  | #endif | ||
|  | 
 | ||
|  | template < class T, class Conversion, bool has_get_pytype=false > | ||
|  | struct to_python_converter  | ||
|  | { | ||
|  | #ifndef BOOST_PYTHON_NO_PY_SIGNATURES | ||
|  |     typedef boost::mpl::bool_<has_get_pytype> HasGetPytype; | ||
|  | 
 | ||
|  |     static PyTypeObject const* get_pytype_1(boost::mpl::true_ *) | ||
|  |     { | ||
|  |         return Conversion::get_pytype(); | ||
|  |     } | ||
|  | 
 | ||
|  |     static PyTypeObject const* get_pytype_1(boost::mpl::false_ *) | ||
|  |     { | ||
|  |         return 0; | ||
|  |     } | ||
|  |     static PyTypeObject const* get_pytype_impl() | ||
|  |     { | ||
|  |         return get_pytype_1((HasGetPytype*)0); | ||
|  |     } | ||
|  | #endif | ||
|  |      | ||
|  |     to_python_converter(); | ||
|  | }; | ||
|  | 
 | ||
|  | // | ||
|  | // implementation | ||
|  | // | ||
|  | 
 | ||
|  | template <class T, class Conversion ,bool has_get_pytype> | ||
|  | to_python_converter<T,Conversion, has_get_pytype>::to_python_converter() | ||
|  | { | ||
|  |     typedef converter::as_to_python_function< | ||
|  |         T, Conversion | ||
|  |         > normalized; | ||
|  |              | ||
|  |     converter::registry::insert( | ||
|  |         &normalized::convert | ||
|  |         , type_id<T>() | ||
|  | #ifndef BOOST_PYTHON_NO_PY_SIGNATURES | ||
|  |         , &get_pytype_impl | ||
|  | #endif | ||
|  |         ); | ||
|  | } | ||
|  | 
 | ||
|  | }} // namespace boost::python | ||
|  | 
 | ||
|  | #endif // TO_PYTHON_CONVERTER_DWA200221_HPP | ||
|  | 
 |