00001
00002
00003 #ifndef DUNE_CLASSNAME_HH
00004 #define DUNE_CLASSNAME_HH
00005
00011 #include <cstdlib>
00012 #include <string>
00013 #include <typeinfo>
00014
00015 #if HAVE_CXA_DEMANGLE
00016 #include <cxxabi.h>
00017 #endif // #if HAVE_CXA_DEMANGLE
00018
00019 namespace Dune {
00020
00022 template <class T>
00023 std::string className ()
00024 {
00025 typedef typename std::remove_reference<T>::type TR;
00026 std::string className = typeid( TR ).name();
00027 #if HAVE_CXA_DEMANGLE
00028 int status;
00029 char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status );
00030 if( demangled )
00031 {
00032 className = demangled;
00033 std::free( demangled );
00034 }
00035 #endif // #if HAVE_CXA_DEMANGLE
00036 if (std::is_const<TR>::value)
00037 className += " const";
00038 if (std::is_volatile<TR>::value)
00039 className += " volatile";
00040 if (std::is_lvalue_reference<T>::value)
00041 className += "&";
00042 else if (std::is_rvalue_reference<T>::value)
00043 className += "&&";
00044 return className;
00045 }
00046
00048 template <class T>
00049 std::string className ( T& )
00050 {
00051 return className<T>();
00052 }
00053 }
00054
00055 #endif // DUNE_CLASSNAME_HH