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
							 |