Avoid assert() when loading xml: Throw an XMLerror if attribute_value fails.
[ardour.git] / libs / pbd / pbd / demangle.h
index 12dc58839c064977bd1e263482023a23b7706d94..9e28abe60072ac6b9473af01bb9cd9d30c6e28d3 100644 (file)
 #include <cstdlib>
 #include <typeinfo>
 
-#ifdef __GNUC__
-#include <cxxabi.h>
-#endif
-
 #include "pbd/libpbd_visibility.h"
 
 namespace PBD
 {
-       template<typename T> /*LIBPBD_API*/ 
-       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
-                   See also: http://msdn.microsoft.com/en-us/library/ms680344%28VS.85%29.aspx
-                */
-                
-               return typeid(obj).name();
-       }
+
+/**
+ * @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)
+{
+       return demangle_symbol(typeid(obj).name());
+}
+
 } // namespace
 
 #endif // __libpbd_demangle_h__