summaryrefslogtreecommitdiff
path: root/src/util.h
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-11-16 12:38:37 -0600
committerNathan Ringo <nathan@remexre.com>2024-11-16 12:38:37 -0600
commit57331ba9756df043b5c665aa4952a0a7b38799e5 (patch)
tree0feb2ca5cbe38744088845b8bb105673016c1fac /src/util.h
Initial commit
Diffstat (limited to 'src/util.h')
-rw-r--r--src/util.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/util.h b/src/util.h
new file mode 100644
index 0000000..569054b
--- /dev/null
+++ b/src/util.h
@@ -0,0 +1,31 @@
+#ifndef IMB3_UTIL_H
+#define IMB3_UTIL_H
+
+#include <stdbool.h>
+#include <stdnoreturn.h>
+
+static inline bool likely(bool cond) { return __builtin_expect(cond, true); }
+static inline bool unlikely(bool cond) { return __builtin_expect(cond, false); }
+
+#ifndef NDEBUG
+noreturn void assume__failed(const char *file, int line, const char *expr);
+#endif // NDEBUG
+
+static inline void assume__impl(bool cond, const char *file, int line,
+ const char *expr) {
+#ifndef NDEBUG
+ if (unlikely(!cond))
+ assume__failed(file, line, expr);
+#endif // NDEBUG
+ if (unlikely(!cond))
+ __builtin_unreachable();
+}
+
+#define assume(COND) assume__impl(COND, __FILE__, __LINE__, #COND)
+
+__attribute__((format(printf, 3, 4))) noreturn void
+todo__impl(const char *file, int line, const char *fmt, ...);
+
+#define todo(...) todo__impl(__FILE__, __LINE__, __VA_ARGS__)
+
+#endif // IMB3_UTIL_H