#define _kassert_pick(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, NAME, ...) \
NAME
#define _kassert_1(prefix, x) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Assertion \"" #x "\" failed"); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_n(prefix, x, fmt, ...) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Assertion \"" #x "\" failed with message: " fmt, \
##__VA_ARGS__); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_oops_1(prefix, x) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Oops, assertion \"" #x "\" failed"); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_oops_n(prefix, x, fmt, ...) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Oops, assertion \"" #x \
"\" failed with message: " fmt, \
##__VA_ARGS__); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_debug_1(prefix, x) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Debug assertion \"" #x "\" failed"); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_debug_n(prefix, x, fmt, ...) \
do { \
if (unlikely(!(x))) { \
panic(prefix "Debug assertion \"" #x \
"\" failed with message: " fmt, \
##__VA_ARGS__); \
__builtin_unreachable(); \
} \
} while (0)
#define _kassert_dispatch(name, prefix, ...) \
_kassert_pick(__VA_ARGS__, name##_n, name##_n, name##_n, name##_n, \
name##_n, name##_n, name##_n, name##_n, name##_n, name##_n, \
name##_1)(prefix, __VA_ARGS__)
#define _kassert_fail(prefix, ...) \
do { \
panic(prefix __VA_ARGS__); \
__builtin_unreachable(); \
} while (0)
#define kassert(...) _kassert_dispatch(_kassert, "", __VA_ARGS__)
#define kassert_unreachable(...) _kassert_fail("unreachable! ", ##__VA_ARGS__)
#define kassert_unimplemented(...) \
_kassert_fail("unimplemented! ", ##__VA_ARGS__)
#define kassert_todo(...) _kassert_fail("TODO: ", ##__VA_ARGS__)
#define kassert_debug(...) \
_kassert_dispatch(_kassert_debug, "DEBUG ", __VA_ARGS__)
#define kassert_debug_unreachable(...) \
_kassert_fail("DEBUG unreachable! ", ##__VA_ARGS__)
#define kassert_debug_unimplemented(...) \
_kassert_fail("DEBUG unimplemented! ", ##__VA_ARGS__)
#define kassert_debug_todo(...) _kassert_fail("DEBUG TODO: ", ##__VA_ARGS__)
#define kassert_debug(...) ((void) 0)
#define kassert_debug_unreachable(...) ((void) 0)
#define kassert_debug_unimplemented(...) ((void) 0)
#define kassert_debug_todo(...) ((void) 0)