3 #ifdef IMPLEMENT_ASSERT_LIB
22 std::vector<std::string>
36 demangle_symbol(
const char*
const symbol)
38 const std::unique_ptr<char, decltype(&std::free)> demangled
40 abi::__cxa_demangle(symbol,
nullptr,
nullptr,
nullptr),
45 return demangled.get();
51 std::vector<std::string>
52 run_backtrace(
int skip)
56 const int n = ::backtrace
58 static_cast<void**
>(addresses),
59 std::extent<decltype(addresses)>::value
61 const std::unique_ptr<
char*, decltype(&std::free)> symbols
63 ::backtrace_symbols(
static_cast<void* const*
>(addresses), n),
67 std::vector<std::string> ret;
68 for(
int backtrace_index = skip; backtrace_index <
n; backtrace_index += 1)
72 char*
const symbol = symbols.get()[backtrace_index];
80 while(end != symbol && *end !=
'+')
92 const auto first_symbol = std::string(symbol, ++
begin - symbol);
94 const auto second_symbol = demangle_symbol(
begin);
95 ret.emplace_back(fmt::format(
"{}{}+{}", first_symbol, second_symbol, end));
99 ret.emplace_back(symbol);
110 template <>
struct fmt::formatter<
eu::assertlib::AssertArgumentValue> : formatter<std::string>
112 template <
typename FormatContext>
115 return formatter<string_view>::format(
c.value, ctx);
122 should_throw_variable()
124 static bool should_throw =
false;
131 should_throw_variable() =
true;
137 return should_throw_variable();
143 const char*
const expression,
145 const char*
const file,
146 const char*
const argstr,
147 const std::vector<AssertArgumentValue>& arguments,
151 const auto start = fmt::format(
152 "Assertion failed: {}\n"
154 "File: {}:{}\n", expression,
function, file,
line);
156 const auto with_arguments = arguments.empty()
158 : fmt::format(
"{}({}) = {}\n", start, argstr,
fmt::join(arguments,
", "))
161 const auto trace = run_backtrace(2);
162 const auto message = trace.empty()
164 : fmt::format(
"{}Backtrace:\n{}\n", with_arguments,
fmt::join(trace,
"\n"))
167 if(should_throw_variable())
169 throw std::move(message);
173 std::cerr << message;
void on_assert(const char *expression, int line, const char *file, const char *argstr, const std::vector< AssertArgumentValue > &arguments, const char *function)
DirPath join(const DirPath &lhs, const DirPath &rhs)