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
							 | 
						||
| 
								 | 
							
								
							 |