123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Boost.Units - A C++ library for zero-overhead dimensional analysis and
- // unit/quantity manipulation and conversion
- //
- // Copyright (C) 2003-2008 Matthias Christian Schabel
- // Copyright (C) 2008 Steven Watanabe
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #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>
- namespace boost {
- namespace units {
- namespace detail {
- 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");
- }
- } // namespace detail
- template<class L>
- std::string simplify_typename(const L& /*source*/)
- {
- const std::string demangled = detail::demangle(typeid(L).name());
- 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*/)
- {
- return std::string(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
|