summaryrefslogtreecommitdiffhomepage
path: root/compat/assert.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-10-02 15:29:41 +0200
committerStanislaw Halik <sthalik@misaki.pl>2022-10-02 15:29:41 +0200
commit445caf6184cafbce361670ea6028ff76317976bc (patch)
tree0ff8c2c33211f7a738de8f6f5d6cec79aa776f36 /compat/assert.hpp
parentf339fa747348e742859701331b529f86d7bd8453 (diff)
a
Diffstat (limited to 'compat/assert.hpp')
-rw-r--r--compat/assert.hpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/compat/assert.hpp b/compat/assert.hpp
new file mode 100644
index 00000000..b2022231
--- /dev/null
+++ b/compat/assert.hpp
@@ -0,0 +1,70 @@
+#pragma once
+#include "defs.hpp"
+#include <limits>
+
+namespace Magnum::Examples {
+
+struct exception {
+ const char* file = nullptr;
+ const char* function = nullptr;
+ int line = -1;
+};
+
+struct assertion_failure final : exception
+{
+ char msg[128 - sizeof(int) - sizeof(char*)];
+};
+
+struct out_of_range final : exception {
+ ssize_t value = 0;
+ ssize_t min = std::numeric_limits<ssize_t>::min();
+ ssize_t max = std::numeric_limits<ssize_t>::max();
+};
+
+struct key_error final : exception {
+ ssize_t value = 0;
+};
+
+#define KEY_ERROR(value) \
+ ::Magnum::Examples::key_error{{__FILE__, FUNCTION_NAME, __LINE__}, (value)}
+
+#define OUT_OF_RANGE(value, min, max) \
+ ::Magnum::Examples::out_of_range{ \
+ {__FILE__, FUNCTION_NAME, __LINE__}, \
+ ::Magnum::Examples::ssize_t((value)), \
+ ::Magnum::Examples::ssize_t((min)), \
+ ::Magnum::Examples::ssize_t((max)) \
+ }
+
+#define ABORT_WITH(exc_type, ...) ([&]() { \
+ exc_type _e; \
+ _e.line = __LINE__; \
+ _e.file = __FILE__; \
+ _e.function = FUNCTION_NAME; \
+ std::snprintf(_e.msg, sizeof(_e.msg), __VA_ARGS__); \
+ throw _e;/*NOLINT(misc-throw-by-value-catch-by-reference)*/ \
+}())
+
+#define ABORT(...) \
+ ABORT_WITH(::Magnum::Examples::assertion_failure, __VA_ARGS__)
+
+#define ASSERT(expr) \
+ do { \
+ if (!(expr)) \
+ ABORT("assertion failed: '%s' in %s:%d", \
+ #expr, __FILE__, __LINE__); \
+ } while(false)
+
+#define GAME_DEBUG_OUT(pfx, ...) ([&]() { \
+ if constexpr (sizeof((pfx)) > 1) \
+ std::fputs((pfx), stderr); \
+ std::fprintf(stderr, __VA_ARGS__); \
+ std::fputs("\n", stderr); \
+ std::fflush(stderr); \
+}())
+
+#define WARN(...) GAME_DEBUG_OUT("warning: ", __VA_ARGS__)
+#define ERR(...) GAME_DEBUG_OUT("error: ", __VA_ARGS__)
+#define DEBUG(...) GAME_DEBUG_OUT("", __VA_ARGS__)
+
+} // namespace Magnum::Examples