summaryrefslogtreecommitdiff
path: root/boost/units/detail/utility.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/units/detail/utility.hpp')
-rw-r--r--boost/units/detail/utility.hpp75
1 files changed, 14 insertions, 61 deletions
diff --git a/boost/units/detail/utility.hpp b/boost/units/detail/utility.hpp
index da46b456eb..1ffa3dc21a 100644
--- a/boost/units/detail/utility.hpp
+++ b/boost/units/detail/utility.hpp
@@ -11,18 +11,9 @@
#ifndef BOOST_UNITS_UTILITY_HPP
#define BOOST_UNITS_UTILITY_HPP
-#include <cstdlib>
#include <typeinfo>
#include <string>
-
-#if defined(__GLIBCXX__) || defined(__GLIBCPP__)
-#define BOOST_UNITS_USE_DEMANGLING
-#include <cxxabi.h>
-#endif // __GNUC__
-
-#ifdef BOOST_UNITS_USE_DEMANGLING
-
-#include <boost/algorithm/string/replace.hpp>
+#include <boost/core/demangle.hpp>
namespace boost {
@@ -34,71 +25,33 @@ inline
std::string
demangle(const char* name)
{
- // need to demangle C++ symbols
- char* realname;
- std::size_t len;
- int stat;
-
- realname = abi::__cxa_demangle(name,NULL,&len,&stat);
-
- if (realname != NULL)
- {
- std::string out(realname);
-
- std::free(realname);
-
- boost::replace_all(out,"boost::units::","");
-
- return out;
- }
-
- return std::string("demangle :: error - unable to demangle specified symbol");
-}
+ std::string demangled = core::demangle(name);
-} // namespace detail
+ const std::string::size_type prefix_len = sizeof("boost::units::") - 1;
+ std::string::size_type i = 0;
+ for (;;)
+ {
+ std::string::size_type pos = demangled.find("boost::units::", i, prefix_len);
+ if (pos == std::string::npos)
+ break;
-template<class L>
-std::string simplify_typename(const L& /*source*/)
-{
- const std::string demangled = detail::demangle(typeid(L).name());
+ demangled.erase(pos, prefix_len);
+ i = pos;
+ }
return demangled;
}
-} // namespace units
-
-} // namespace boost
-
-#else // BOOST_UNITS_USE_DEMANGLING
-
-namespace boost {
-
-namespace units {
-
-namespace detail {
-
-inline
-std::string
-demangle(const char* name)
-{
- return name;
-}
-
} // namespace detail
template<class L>
-std::string simplify_typename(const L& /*source*/)
+inline std::string simplify_typename(const L& /*source*/)
{
- return std::string(typeid(L).name());
+ return detail::demangle(typeid(L).name());
}
} // namespace units
} // namespace boost
-// To get system-specific predefined macros:
-// gcc -arch ppc -dM -E - < /dev/null | sort
-
-#endif // BOOST_UNITS_USE_DEMANGLING
-
#endif // BOOST_UNITS_UTILITY_HPP