• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
2 // unit/quantity manipulation and conversion
3 //
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
5 // Copyright (C) 2008 Steven Watanabe
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See
8 // accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 #ifndef BOOST_UNITS_UTILITY_HPP
12 #define BOOST_UNITS_UTILITY_HPP
13 
14 #include <cstdlib>
15 #include <typeinfo>
16 #include <string>
17 
18 #if defined(__GLIBCXX__) || defined(__GLIBCPP__)
19 #define BOOST_UNITS_USE_DEMANGLING
20 #include <cxxabi.h>
21 #endif // __GNUC__
22 
23 #ifdef BOOST_UNITS_USE_DEMANGLING
24 
25 #include <boost/algorithm/string/replace.hpp>
26 
27 namespace boost {
28 
29 namespace units {
30 
31 namespace detail {
32 
33 inline
34 std::string
demangle(const char * name)35 demangle(const char* name)
36 {
37     // need to demangle C++ symbols
38     char*       realname;
39     std::size_t len;
40     int         stat;
41 
42     realname = abi::__cxa_demangle(name,NULL,&len,&stat);
43 
44     if (realname != NULL)
45     {
46         std::string   out(realname);
47 
48         std::free(realname);
49 
50         boost::replace_all(out,"boost::units::","");
51 
52         return out;
53     }
54 
55     return std::string("demangle :: error - unable to demangle specified symbol");
56 }
57 
58 } // namespace detail
59 
60 template<class L>
simplify_typename(const L &)61 std::string simplify_typename(const L& /*source*/)
62 {
63     const std::string   demangled = detail::demangle(typeid(L).name());
64 
65     return demangled;
66 }
67 
68 } // namespace units
69 
70 } // namespace boost
71 
72 #else // BOOST_UNITS_USE_DEMANGLING
73 
74 namespace boost {
75 
76 namespace units {
77 
78 namespace detail {
79 
80 inline
81 std::string
demangle(const char * name)82 demangle(const char* name)
83 {
84     return name;
85 }
86 
87 } // namespace detail
88 
89 template<class L>
simplify_typename(const L &)90 std::string simplify_typename(const L& /*source*/)
91 {
92     return std::string(typeid(L).name());
93 }
94 
95 } // namespace units
96 
97 } // namespace boost
98 
99 // To get system-specific predefined macros:
100 // gcc -arch ppc -dM -E - < /dev/null | sort
101 
102 #endif // BOOST_UNITS_USE_DEMANGLING
103 
104 #endif // BOOST_UNITS_UTILITY_HPP
105