4 #pragma warning(disable:4297)
10 #include "../Utils/Console.h"
27 typename std::enable_if<String::CanBeStringified<T_>::Value, std::string>::type
28 fromhelper(
const T_ &t) {
33 typename std::enable_if<!String::CanBeStringified<T_>::Value, std::string>::type
34 fromhelper(
const T_ &t) {
38 static struct alltag {} AllTag;
39 static struct dumponlytag {} DumpOnlyTag;
41 CrashHandler(
const std::string &expression,
const std::string &message,
int skip=1,
42 int depth=4,
bool se=
false,
bool so=
false) :
43 original(expression), message(message), skip(skip), depth(depth),
44 show_expanded(se), show_original(so)
47 CrashHandler(alltag,
const std::string &expression,
const std::string &message,
int skip=1,
48 int depth=4,
bool se=
true,
bool so=
true) :
49 original(expression), message(message), skip(skip), depth(depth),
50 show_expanded(se), show_original(so)
53 CrashHandler(dumponlytag,
const std::string &expression,
const std::string &message,
int skip=1,
54 int depth=4,
bool se=
false,
bool so=
false) :
55 original(expression), message(message), skip(skip), depth(depth),
56 show_expanded(se), show_original(so), dumponly(true)
62 auto console = Utils::StdConsole();
63 console.SetColor(console.Red);
66 std::cout<<
"Assertation failed: ";
67 console.SetColor(console.Default);
68 std::cout<<message<<std::endl;
72 std::cout<<
" "<<original;
73 console.SetColor(console.Red);
74 std::cout<<
" evaluates to false"<<std::endl;
79 console.SetColor(console.Green);
80 std::cout<<
" "<<expanded;
81 console.SetColor(console.Red);
82 std::cout<<
" ==> FALSE"<<std::endl;
91 #pragma GCC diagnostic push
92 #pragma GCC diagnostic ignored "-Wterminate"
93 throw AssertationException(message);
94 #pragma GCC diagnostic pop
102 #define gorgon_makeoperator(op) \
104 CrashHandler &operator op(const T_ &arg) { \
124 gorgon_makeoperator(==)
125 gorgon_makeoperator(!=)
126 gorgon_makeoperator(>)
127 gorgon_makeoperator(>=)
128 gorgon_makeoperator(<=)
129 gorgon_makeoperator(||)
130 gorgon_makeoperator(&&)
132 #undef gorgon_makeoperator
135 std::string original;
136 std::string expanded;
151 #define ASSERT_ALL(...)
152 #define ASSERT_DUMP(...)
161 #define ASSERT(expression, message, ...) do { if(!bool(expression)) { \
162 auto temp = Gorgon::Utils::CrashHandler(#expression, message, ##__VA_ARGS__); } } while(0)
171 #define ASSERT_ALL(expression, message, ...) do { if(!bool(expression)) { \
172 auto temp = Gorgon::Utils::CrashHandler(Gorgon::Utils::CrashHandler::AllTag, #expression, message, ##__VA_ARGS__); } } while(0)
182 #define ASSERT_DUMP(expression, message, ...) do { if(!bool(expression)) { \
183 auto temp = Gorgon::Utils::CrashHandler(Gorgon::Utils::CrashHandler::DumpOnlyTag,#expression, message, ##__VA_ARGS__); } } while(0)
187 [[noreturn]]
inline void NotImplemented (
const std::string &what =
"This feature") {
188 ASSERT(
false, what+
" is not implemented.", 0, 8);
192 [[noreturn]]
inline void ASSERT_FALSE(
const std::string &message,
int skip = 1,
int depth = 4) {
193 ASSERT(
false, message, skip, depth);