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
 | 
