25#ifndef TIMEMORY_UTILITY_DEMANGLE_CPP_
26#define TIMEMORY_UTILITY_DEMANGLE_CPP_ 1
30#if !defined(TIMEMORY_UTILITY_HEADER_MODE)
43#if defined(TIMEMORY_UNIX)
46demangle_backtrace(
const char* cstr)
50 while(!_sub.empty() && (_pos = _sub.find_first_of(
' ')) == 0)
52 _sub = _sub.erase(_pos, 1);
55 while(!_sub.empty() && (_pos = _sub.find_last_of(
' ')) == _sub.length() - 1)
57 _sub = _sub.substr(0, _sub.length() - 1);
67 auto beg = str.find(
'(');
68 if(beg == std::string::npos)
71 if(beg != std::string::npos)
74 auto end = str.find(
'+', beg);
75 if(beg != std::string::npos &&
end != std::string::npos)
77 auto len =
end - (beg + 1);
78 auto sub = str.substr(beg + 1, len);
79 auto dem =
demangle(_trim(sub, len));
80 str = str.replace(beg + 1, len, dem);
82 else if(beg != std::string::npos)
84 auto len = str.length() - (beg + 1);
85 auto sub = str.substr(beg + 1, len);
86 auto dem =
demangle(_trim(sub, len));
87 str = str.replace(beg + 1, len, dem);
89 else if(
end != std::string::npos)
92 auto sub = str.substr(beg, len);
93 auto dem =
demangle(_trim(sub, len));
94 str = str.replace(beg, len, dem);
105 using pair_t = std::pair<std::string, std::string>;
106 for(
auto&& itr : { pair_t{ demangle<std::string>(),
"std::string" },
107 pair_t{ demangle<std::istream>(),
"std::istream" },
108 pair_t{ demangle<std::ostream>(),
"std::ostream" },
109 pair_t{ demangle<std::stringstream>(),
"std::stringstream" },
110 pair_t{ demangle<std::istringstream>(),
"std::istringstream" },
111 pair_t{ demangle<std::ostringstream>(),
"std::ostringstream" } })
121 return demangle_backtrace(str.c_str());
125demangle_unw_backtrace(
const char* cstr)
131 auto _beg = _str.find(
"_Z");
132 auto _end = _str.find(
' ', _beg);
133 if(_beg != std::string::npos && _end != std::string::npos)
135 auto _len = _end - _beg;
136 auto _sub = _str.substr(_beg, _len);
138 _str = _str.replace(_beg, _len, _dem);
149 using pair_t = std::pair<std::string, std::string>;
150 for(
auto&& itr : { pair_t{ demangle<std::string>(),
"std::string" },
151 pair_t{ demangle<std::istream>(),
"std::istream" },
152 pair_t{ demangle<std::ostream>(),
"std::ostream" },
153 pair_t{ demangle<std::stringstream>(),
"std::stringstream" },
154 pair_t{ demangle<std::istringstream>(),
"std::istringstream" },
155 pair_t{ demangle<std::ostringstream>(),
"std::ostringstream" } })
167 return demangle_unw_backtrace(_str.c_str());
std::string str_transform(const std::string &input, const std::string &_begin, const std::string &_end, PredicateT &&predicate)
apply a string transformation to substring inbetween a common delimiter. e.g.
std::string demangle(const char *_mangled_name, int *_status=nullptr)
tim::mpl::apply< std::string > string
#define TIMEMORY_TESTING_EXCEPTION(...)