Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/units/detail/utility.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
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 | |
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> | |
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 | |
82 demangle(const char* name) | |
83 { | |
84 return name; | |
85 } | |
86 | |
87 } // namespace detail | |
88 | |
89 template<class 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 |