37 inline std::string demangle(
char const* name) {
39 char* dName = abi::__cxa_demangle(name, 0, 0, 0);
40 if (dName == 0)
return name;
41 char const* p = dName;
48 for (
char c = *p++; c; c = *p++) {
51 while (std::isspace(*p)) {
63 inline std::string demangleTypename(
char const* name) {
64 std::string s = demangle(name);
68 while (j + 1 < s.size()) {
69 if (std::isalnum(s[j])) {
72 else if (s[j] ==
':' && s[j + 1] ==
':') {
73 s = s.replace(i, j + 2 - i,
"");
76 else if (s[j] ==
'(') {
78 while (k < s.size() && s[k++] !=
')');
79 s = s.replace(j, k - j,
"");
90 std::string typenameof() {
91 return demangleTypename(
typeid(T).name());
95 std::string typenameof(T
const& obj) {
96 return demangleTypename(
typeid(obj).name());