Chris@102: #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED Chris@102: #define BOOST_CORE_DEMANGLE_HPP_INCLUDED Chris@102: Chris@102: // core::demangle Chris@102: // Chris@102: // Copyright 2014 Peter Dimov Chris@102: // Copyright 2014 Andrey Semashev Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #if defined( __clang__ ) && defined( __has_include ) Chris@102: # if __has_include() Chris@102: # define BOOST_CORE_HAS_CXXABI_H Chris@102: # endif Chris@102: #elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ ) Chris@102: # define BOOST_CORE_HAS_CXXABI_H Chris@102: #endif Chris@102: Chris@102: #if defined( BOOST_CORE_HAS_CXXABI_H ) Chris@102: # include Chris@102: # include Chris@102: # include Chris@102: #endif Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: Chris@102: namespace core Chris@102: { Chris@102: Chris@102: inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT; Chris@102: inline void demangle_free( char const * name ) BOOST_NOEXCEPT; Chris@102: Chris@102: class scoped_demangled_name Chris@102: { Chris@102: private: Chris@102: char const * m_p; Chris@102: Chris@102: public: Chris@102: explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT : Chris@102: m_p( demangle_alloc( name ) ) Chris@102: { Chris@102: } Chris@102: Chris@102: ~scoped_demangled_name() BOOST_NOEXCEPT Chris@102: { Chris@102: demangle_free( m_p ); Chris@102: } Chris@102: Chris@102: char const * get() const BOOST_NOEXCEPT Chris@102: { Chris@102: return m_p; Chris@102: } Chris@102: Chris@102: BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& )) Chris@102: BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& )) Chris@102: }; Chris@102: Chris@102: Chris@102: #if defined( BOOST_CORE_HAS_CXXABI_H ) Chris@102: Chris@102: inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT Chris@102: { Chris@102: int status = 0; Chris@102: std::size_t size = 0; Chris@102: return abi::__cxa_demangle( name, NULL, &size, &status ); Chris@102: } Chris@102: Chris@102: inline void demangle_free( char const * name ) BOOST_NOEXCEPT Chris@102: { Chris@102: std::free( const_cast< char* >( name ) ); Chris@102: } Chris@102: Chris@102: inline std::string demangle( char const * name ) Chris@102: { Chris@102: scoped_demangled_name demangled_name( name ); Chris@102: char const * const p = demangled_name.get(); Chris@102: if( p ) Chris@102: { Chris@102: return p; Chris@102: } Chris@102: else Chris@102: { Chris@102: return name; Chris@102: } Chris@102: } Chris@102: Chris@102: #else Chris@102: Chris@102: inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT Chris@102: { Chris@102: return name; Chris@102: } Chris@102: Chris@102: inline void demangle_free( char const * ) BOOST_NOEXCEPT Chris@102: { Chris@102: } Chris@102: Chris@102: inline std::string demangle( char const * name ) Chris@102: { Chris@102: return name; Chris@102: } Chris@102: Chris@102: #endif Chris@102: Chris@102: } // namespace core Chris@102: Chris@102: } // namespace boost Chris@102: Chris@102: #undef BOOST_CORE_HAS_CXXABI_H Chris@102: Chris@102: #endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED