127 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright David Abrahams 2002. | ||
|  | // Copyright Stefan Seefeld 2016. | ||
|  | // 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 boost_python_converter_registered_hpp_ | ||
|  | #define boost_python_converter_registered_hpp_ | ||
|  | 
 | ||
|  | #include <boost/python/type_id.hpp> | ||
|  | #include <boost/python/converter/registry.hpp> | ||
|  | #include <boost/python/converter/registrations.hpp> | ||
|  | #include <boost/type_traits/transform_traits.hpp> | ||
|  | #include <boost/type_traits/cv_traits.hpp> | ||
|  | #include <boost/type_traits/is_void.hpp> | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | #include <boost/type.hpp> | ||
|  | #include <memory> | ||
|  | #if defined(BOOST_PYTHON_TRACE_REGISTRY) \ | ||
|  |  || defined(BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND) | ||
|  | # include <iostream> | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | // You'll see shared_ptr mentioned in this header because we need to | ||
|  | // note which types are shared_ptrs in their registrations, to | ||
|  | // implement special shared_ptr handling for rvalue conversions. | ||
|  | template <class T> class shared_ptr; | ||
|  | 
 | ||
|  | namespace python { namespace converter {  | ||
|  | 
 | ||
|  | struct registration; | ||
|  | 
 | ||
|  | namespace detail | ||
|  | { | ||
|  |   template <class T> | ||
|  |   struct registered_base | ||
|  |   { | ||
|  |       static registration const& converters; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct registered | ||
|  |   : detail::registered_base< | ||
|  |         typename add_reference< | ||
|  |             typename add_cv<T>::type | ||
|  |         >::type | ||
|  |     > | ||
|  | { | ||
|  | }; | ||
|  | 
 | ||
|  | # if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) | ||
|  | // collapses a few more types to the same static instance.  MSVC7.1 | ||
|  | // fails to strip cv-qualification from array types in typeid.  For | ||
|  | // some reason we can't use this collapse there or array converters | ||
|  | // will not be found. | ||
|  | template <class T> | ||
|  | struct registered<T&> | ||
|  |   : registered<T> {}; | ||
|  | # endif | ||
|  | 
 | ||
|  | // | ||
|  | // implementations | ||
|  | // | ||
|  | namespace detail | ||
|  | { | ||
|  |   inline void | ||
|  |   register_shared_ptr0(...) | ||
|  |   { | ||
|  |   } | ||
|  |    | ||
|  |   template <class T> | ||
|  |   inline void | ||
|  |   register_shared_ptr0(shared_ptr<T>*) | ||
|  |   { | ||
|  |       registry::lookup_shared_ptr(type_id<shared_ptr<T> >()); | ||
|  |   } | ||
|  | 
 | ||
|  | #if __cplusplus >= 201103L | ||
|  |   template <class T> | ||
|  |   inline void | ||
|  |   register_shared_ptr0(std::shared_ptr<T>*) | ||
|  |   { | ||
|  |       registry::lookup_shared_ptr(type_id<std::shared_ptr<T> >()); | ||
|  |   } | ||
|  | #endif | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   inline void | ||
|  |   register_shared_ptr1(T const volatile*) | ||
|  |   { | ||
|  |       detail::register_shared_ptr0((T*)0); | ||
|  |   } | ||
|  |    | ||
|  |   template <class T> | ||
|  |   inline registration const&  | ||
|  |   registry_lookup2(T&(*)()) | ||
|  |   { | ||
|  |       detail::register_shared_ptr1((T*)0); | ||
|  |       return registry::lookup(type_id<T&>()); | ||
|  |   } | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   inline registration const&  | ||
|  |   registry_lookup1(type<T>) | ||
|  |   { | ||
|  |       return registry_lookup2((T(*)())0); | ||
|  |   } | ||
|  | 
 | ||
|  |   inline registration const&  | ||
|  |   registry_lookup1(type<const volatile void>) | ||
|  |   { | ||
|  |       detail::register_shared_ptr1((void*)0); | ||
|  |       return registry::lookup(type_id<void>()); | ||
|  |   } | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   registration const& registered_base<T>::converters = detail::registry_lookup1(type<T>()); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | }}} // namespace boost::python::converter | ||
|  | 
 | ||
|  | #endif |