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 |