85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			85 lines
		
	
	
		
			2.2 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 MSVC_TYPEINFO_DWA200222_HPP
							 | 
						||
| 
								 | 
							
								# define MSVC_TYPEINFO_DWA200222_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <typeinfo>
							 | 
						||
| 
								 | 
							
								#include <boost/type.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Fix for icc's broken typeid() implementation which doesn't strip
							 | 
						||
| 
								 | 
							
								// decoration. This fix doesn't handle cv-qualified array types. It
							 | 
						||
| 
								 | 
							
								// could probably be done, but I haven't figured it out yet.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Note: This file is badly named. It initially was MSVC specific, but was
							 | 
						||
| 
								 | 
							
								// extended to cover intel too. Now the old version of MSVC is no longer
							 | 
						||
| 
								 | 
							
								// supported, but the intel version is still supported.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# if defined(BOOST_INTEL_CXX_VERSION) && BOOST_INTEL_CXX_VERSION <= 700
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace python { namespace detail { 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef std::type_info const& typeinfo;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								static typeinfo typeid_nonref(T const volatile*) { return typeid(T); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline typeinfo typeid_ref_1(T&(*)())
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return detail::typeid_nonref((T*)0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A non-reference
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline typeinfo typeid_ref(type<T>*, T&(*)(type<T>))
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return detail::typeid_nonref((T*)0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A reference
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline typeinfo typeid_ref(type<T>*, ...)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return detail::typeid_ref_1((T(*)())0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))
							 | 
						||
| 
								 | 
							
								#   define BOOST_PYTT_DECL __cdecl
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#   define BOOST_PYTT_DECL /**/
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template< typename T > T&(* is_ref_tester1(type<T>) )(type<T>) { return 0; }
							 | 
						||
| 
								 | 
							
								inline char BOOST_PYTT_DECL is_ref_tester1(...) { return 0; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline typeinfo msvc_typeid(boost::type<T>*)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return detail::typeid_ref(
							 | 
						||
| 
								 | 
							
								        (boost::type<T>*)0, detail::is_ref_tester1(type<T>())
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								inline typeinfo msvc_typeid<void>(boost::type<void>*)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return typeid(void);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#  ifndef NDEBUG
							 | 
						||
| 
								 | 
							
								inline typeinfo assert_array_typeid_compiles()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return msvc_typeid((boost::type<char const[3]>*)0)
							 | 
						||
| 
								 | 
							
								        , msvc_typeid((boost::type<char[3]>*)0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#  endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}}} // namespace boost::python::detail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# endif // BOOST_INTEL_CXX_VERSION
							 | 
						||
| 
								 | 
							
								#endif // MSVC_TYPEINFO_DWA200222_HPP
							 |