69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.7 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 POINTER_TYPE_ID_DWA2002222_HPP | ||
|  | # define POINTER_TYPE_ID_DWA2002222_HPP | ||
|  | 
 | ||
|  | # include <boost/python/type_id.hpp> | ||
|  | # include <boost/type_traits/composite_traits.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace python { namespace converter {  | ||
|  | 
 | ||
|  | namespace detail | ||
|  | { | ||
|  |   template <bool is_ref = false> | ||
|  |   struct pointer_typeid_select | ||
|  |   { | ||
|  |       template <class T> | ||
|  |       static inline type_info execute(T*(*)() = 0) | ||
|  |       { | ||
|  |           return type_id<T>(); | ||
|  |       } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <> | ||
|  |   struct pointer_typeid_select<true> | ||
|  |   { | ||
|  |       template <class T> | ||
|  |       static inline type_info execute(T* const volatile&(*)() = 0) | ||
|  |       { | ||
|  |           return type_id<T>(); | ||
|  |       } | ||
|  |      | ||
|  |       template <class T> | ||
|  |       static inline type_info execute(T*volatile&(*)() = 0) | ||
|  |       { | ||
|  |           return type_id<T>(); | ||
|  |       } | ||
|  |      | ||
|  |       template <class T> | ||
|  |       static inline type_info execute(T*const&(*)() = 0) | ||
|  |       { | ||
|  |           return type_id<T>(); | ||
|  |       } | ||
|  | 
 | ||
|  |       template <class T> | ||
|  |       static inline type_info execute(T*&(*)() = 0) | ||
|  |       { | ||
|  |           return type_id<T>(); | ||
|  |       } | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | // Usage: pointer_type_id<T>() | ||
|  | // | ||
|  | // Returns a type_info associated with the type pointed | ||
|  | // to by T, which may be a pointer or a reference to a pointer. | ||
|  | template <class T> | ||
|  | type_info pointer_type_id(T(*)() = 0) | ||
|  | { | ||
|  |     return detail::pointer_typeid_select< | ||
|  |           is_reference<T>::value | ||
|  |         >::execute((T(*)())0); | ||
|  | } | ||
|  | 
 | ||
|  | }}} // namespace boost::python::converter | ||
|  | 
 | ||
|  | #endif // POINTER_TYPE_ID_DWA2002222_HPP |