7 #ifndef JADE_ASSERT_HPP__
8 #define JADE_ASSERT_HPP__
10 #include "jade.system.hpp"
22 template <
typename TChar>
50 void * addresses[256];
51 const auto n = ::backtrace(
53 std::extent<decltype(addresses)>::value);
55 typedef std::unique_ptr<
60 const symbols_ptr_type symbols_ptr (
61 _backtrace_symbols(addresses, n),
63 const auto symbols = symbols_ptr.get();
65 for (
auto i = 1; i < n; i++)
67 const auto symbol = symbols[i];
76 while (end != symbol && *end !=
char_type(
'+'))
78 while (end > symbol && end[-1] ==
char_type(
' '))
85 auto begin = std::max(symbol, end - 1);
97 if (begin <= symbol || end <= symbol)
99 err << symbol << std::endl;
103 for (
auto p = symbol; p != begin; p++)
105 const auto replaced = *end;
108 err << _demangle(begin) << replaced << end << std::endl;
112 throw std::runtime_error(
"assertion failure");
118 void *
const * buffer,
131 typedef std::unique_ptr<
136 const ptr_type demangled (
137 _cxa_demangle(symbol,
nullptr,
nullptr,
nullptr),
140 return demangled ? demangled.get() : symbol;
144 static std::basic_ostream<char_type> & _err();
149 inline char ** basic_assertion<char>::_backtrace_symbols(
150 void *
const * buffer,
153 return ::backtrace_symbols(buffer, size);
158 inline char * basic_assertion<char>::_cxa_demangle(
159 const char_type * mangled_name,
160 char_type * output_buffer,
164 return abi::__cxa_demangle(
172 inline std::ostream & basic_assertion<char>::_err()
180 typedef basic_assertion<char> assertion;
183 #define assert(E) jade::assertion::validate(E, #E, __FILE__, __LINE__)
189 #endif // JADE_ASSERT_HPP__