152 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
 | |
| #define BOOST_CORE_TYPEINFO_HPP_INCLUDED
 | |
| 
 | |
| // MS compatible compilers support #pragma once
 | |
| 
 | |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | |
| # pragma once
 | |
| #endif
 | |
| 
 | |
| //  core::typeinfo, BOOST_CORE_TYPEID
 | |
| //
 | |
| //  Copyright 2007, 2014 Peter Dimov
 | |
| //
 | |
| //  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)
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| 
 | |
| #if defined( BOOST_NO_TYPEID )
 | |
| 
 | |
| #include <boost/current_function.hpp>
 | |
| #include <functional>
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
| 
 | |
| namespace core
 | |
| {
 | |
| 
 | |
| class typeinfo
 | |
| {
 | |
| private:
 | |
| 
 | |
|     typeinfo( typeinfo const& );
 | |
|     typeinfo& operator=( typeinfo const& );
 | |
| 
 | |
|     char const * name_;
 | |
| 
 | |
| public:
 | |
| 
 | |
|     explicit typeinfo( char const * name ): name_( name )
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     bool operator==( typeinfo const& rhs ) const
 | |
|     {
 | |
|         return this == &rhs;
 | |
|     }
 | |
| 
 | |
|     bool operator!=( typeinfo const& rhs ) const
 | |
|     {
 | |
|         return this != &rhs;
 | |
|     }
 | |
| 
 | |
|     bool before( typeinfo const& rhs ) const
 | |
|     {
 | |
|         return std::less< typeinfo const* >()( this, &rhs );
 | |
|     }
 | |
| 
 | |
|     char const* name() const
 | |
|     {
 | |
|         return name_;
 | |
|     }
 | |
| };
 | |
| 
 | |
| inline char const * demangled_name( core::typeinfo const & ti )
 | |
| {
 | |
|     return ti.name();
 | |
| }
 | |
| 
 | |
| } // namespace core
 | |
| 
 | |
| namespace detail
 | |
| {
 | |
| 
 | |
| template<class T> struct core_typeid_
 | |
| {
 | |
|     static boost::core::typeinfo ti_;
 | |
| 
 | |
|     static char const * name()
 | |
|     {
 | |
|         return BOOST_CURRENT_FUNCTION;
 | |
|     }
 | |
| };
 | |
| 
 | |
| #if defined(__SUNPRO_CC)
 | |
| // see #4199, the Sun Studio compiler gets confused about static initialization 
 | |
| // constructor arguments. But an assignment works just fine. 
 | |
| template<class T> boost::core::typeinfo core_typeid_< T >::ti_ = core_typeid_< T >::name();
 | |
| #else
 | |
| template<class T> boost::core::typeinfo core_typeid_< T >::ti_(core_typeid_< T >::name());
 | |
| #endif
 | |
| 
 | |
| template<class T> struct core_typeid_< T & >: core_typeid_< T >
 | |
| {
 | |
| };
 | |
| 
 | |
| template<class T> struct core_typeid_< T const >: core_typeid_< T >
 | |
| {
 | |
| };
 | |
| 
 | |
| template<class T> struct core_typeid_< T volatile >: core_typeid_< T >
 | |
| {
 | |
| };
 | |
| 
 | |
| template<class T> struct core_typeid_< T const volatile >: core_typeid_< T >
 | |
| {
 | |
| };
 | |
| 
 | |
| } // namespace detail
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #define BOOST_CORE_TYPEID(T) (boost::detail::core_typeid_<T>::ti_)
 | |
| 
 | |
| #else
 | |
| 
 | |
| #include <boost/core/demangle.hpp>
 | |
| #include <typeinfo>
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
| 
 | |
| namespace core
 | |
| {
 | |
| 
 | |
| #if defined( BOOST_NO_STD_TYPEINFO )
 | |
| 
 | |
| typedef ::type_info typeinfo;
 | |
| 
 | |
| #else
 | |
| 
 | |
| typedef std::type_info typeinfo;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| inline std::string demangled_name( core::typeinfo const & ti )
 | |
| {
 | |
|     return core::demangle( ti.name() );
 | |
| }
 | |
| 
 | |
| } // namespace core
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #define BOOST_CORE_TYPEID(T) typeid(T)
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif  // #ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
 | 
