Use PBD::demangle_symbol in PBD::demangled_name<T> to reduce code duplication
[ardour.git] / libs / pbd / pbd / demangle.h
index 5e6f2a1b5666206ddd24a5a58ee9ad40e6e6706d..71eca1658314b537a8fd2931f7866e177299e628 100644 (file)
 
 #include <string>
 #include <cstdlib>
+#include <typeinfo>
 
-#ifdef __GNUC__
-#include <cxxabi.h>
-#endif
+#include "pbd/libpbd_visibility.h"
 
 namespace PBD
 {
+
+       /**
+        * @param symbol a mangled symbol/name
+        * @return a demangled symbol/name
+        */
+       LIBPBD_API std::string demangle_symbol(const std::string& symbol);
+
+       /**
+        * @param str a string containing a mangled symbol/name
+        * @return a string with the mangled symbol/name replaced with a demangled
+        * name
+        */
+       LIBPBD_API std::string demangle(const std::string& str);
+
        template<typename T>
        std::string demangled_name (T const & obj)
        {
-#ifdef __GNUC__
-               int status;
-               char * res = abi::__cxa_demangle (typeid(obj).name(), 0, 0, &status);
-               if (status == 0) {
-                       std::string s(res);
-                       free (res);
-                       return s;
-               }
-#endif
-
-                /* Note: on win32, you can use UnDecorateSymbolName.
-                   See http://msdn.microsoft.com/en-us/library/ms681400%28VS.85%29.aspx
-                */
-                
-               return typeid(obj).name();
+               return demangle_symbol(typeid(obj).name());
        }
+
 } // namespace
 
 #endif // __libpbd_demangle_h__