#ifndef IMB3_UTIL_H #define IMB3_UTIL_H #include #include 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))) void debugf__impl(const char *file, int line, const char *fmt, ...); #define debugf(...) debugf__impl(__FILE__, __LINE__, __VA_ARGS__) __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__) __attribute__((format(printf, 3, 4))) noreturn void unreachable__impl(const char *file, int line, const char *fmt, ...); #define unreachable(...) unreachable__impl(__FILE__, __LINE__, __VA_ARGS__) #endif // IMB3_UTIL_H