dune-common 2.1.1
|
00001 #ifndef DUNE_CLASSNAME_HH 00002 #define DUNE_CLASSNAME_HH 00003 00009 #include <cstdlib> 00010 #include <string> 00011 #include <typeinfo> 00012 00013 #if defined(__GNUC__) && ! defined(__clang__) 00014 #include <cxxabi.h> 00015 #endif // #ifdef __GNUC__ 00016 00017 namespace Dune { 00018 00020 template <class T> 00021 std::string className ( T &t ) 00022 { 00023 std::string className = typeid( t ).name(); 00024 #if defined(__GNUC__) && ! defined(__clang__) 00025 int status; 00026 char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status ); 00027 if( demangled ) 00028 { 00029 className = demangled; 00030 std::free( demangled ); 00031 } 00032 #endif // #ifdef __GNUC__ 00033 return className; 00034 }; 00035 00037 template <class T> 00038 std::string className () 00039 { 00040 std::string className = typeid( T ).name(); 00041 #if defined(__GNUC__) && ! defined(__clang__) 00042 int status; 00043 char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status ); 00044 if( demangled ) 00045 { 00046 className = demangled; 00047 std::free( demangled ); 00048 } 00049 #endif // #ifdef __GNUC__ 00050 return className; 00051 }; 00052 00053 } // namespace Dune 00054 00055 #endif // DUNE_CLASSNAME_HH