demangle_util.h
Go to the documentation of this file.
00001 #ifndef DEMANGLE_UTIL_H
00002 #define DEMANGLE_UTIL_H
00003 
00004 #include <string>
00005 
00006 
00007 #if defined( __clang__ ) && defined( __has_include )
00008 # if __has_include(<cxxabi.h>)
00009 #  define HAS_CXXABI_H
00010 # endif
00011 #elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
00012 # define HAS_CXXABI_H
00013 #endif
00014 
00015 #if defined( HAS_CXXABI_H )
00016 # include <cxxabi.h>
00017 # include <cstdlib>
00018 # include <cstddef>
00019 #endif
00020 
00021 namespace BT
00022 {
00023 
00024 inline char const * demangle_alloc( char const * name ) noexcept;
00025 inline void demangle_free( char const * name ) noexcept;
00026 
00027 class scoped_demangled_name
00028 {
00029 private:
00030     char const * m_p;
00031 
00032 public:
00033     explicit scoped_demangled_name( char const * name ) noexcept :
00034         m_p( demangle_alloc( name ) )
00035     {
00036     }
00037 
00038     ~scoped_demangled_name() noexcept
00039     {
00040         demangle_free( m_p );
00041     }
00042 
00043     char const * get() const noexcept
00044     {
00045         return m_p;
00046     }
00047 
00048     scoped_demangled_name( scoped_demangled_name const& ) = delete;
00049     scoped_demangled_name& operator= ( scoped_demangled_name const& ) = delete;
00050 };
00051 
00052 
00053 #if defined( HAS_CXXABI_H )
00054 
00055 inline char const * demangle_alloc( char const * name ) noexcept
00056 {
00057     int status = 0;
00058     std::size_t size = 0;
00059     return abi::__cxa_demangle( name, NULL, &size, &status );
00060 }
00061 
00062 inline void demangle_free( char const * name ) noexcept
00063 {
00064     std::free( const_cast< char* >( name ) );
00065 }
00066 
00067 #else
00068 
00069 inline char const * demangle_alloc( char const * name ) noexcept
00070 {
00071     return name;
00072 }
00073 
00074 inline void demangle_free( char const * ) noexcept
00075 {
00076 }
00077 
00078 inline std::string demangle( char const * name )
00079 {
00080     return name;
00081 }
00082 
00083 #endif
00084 
00085 inline std::string demangle(const std::type_info* info)
00086 {
00087     if (!info)
00088     {
00089         return "void";
00090     }
00091     if (info == &typeid(std::string))
00092     {
00093         return "std::string";
00094     }
00095     scoped_demangled_name demangled_name(info->name());
00096     char const* const p = demangled_name.get();
00097     if (p)
00098     {
00099         return p;
00100     }
00101     else
00102     {
00103         return info->name();
00104     }
00105 }
00106 
00107 inline std::string demangle(const std::type_info& info)
00108 {
00109     return demangle(&info);
00110 }
00111 
00112 } // namespace BT
00113 
00114 #undef HAS_CXXABI_H
00115 
00116 #endif // DEMANGLE_UTIL_H


behaviortree_cpp
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Sat Jun 8 2019 20:17:15