diff --git a/BAN/include/BAN/Assert.h b/BAN/include/BAN/Assert.h index e24761d05..9e9de1b39 100644 --- a/BAN/include/BAN/Assert.h +++ b/BAN/include/BAN/Assert.h @@ -1,11 +1,33 @@ #pragma once +#include + #if defined(__is_kernel) #include - #define ASSERT(cond) do { if (!(cond)) Kernel::panic("ASSERT("#cond") failed"); } while (false) + + #define ASSERT(cond) \ + do { \ + if (!(cond)) \ + Kernel::panic("ASSERT(" #cond ") failed"); \ + } while (false) + + #define __ASSERT_BIN_OP(lhs, rhs, name, op) \ + do { \ + auto&& _lhs = lhs; \ + auto&& _rhs = rhs; \ + if (!(_lhs op _rhs)) \ + Kernel::panic(name "(" #lhs ", " #rhs ") ({} " #op " {}) failed", _lhs, _rhs); \ + } while (false) + + #define ASSERT_LT(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_LT", <) + #define ASSERT_LE(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_LE", <=) + #define ASSERT_GT(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_GT", >) + #define ASSERT_GE(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_GE", >=) + #define ASSERT_EQ(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_EQ", ==) + #define ASSERT_NE(lhs, rhs) __ASSERT_BIN_OP(lhs, rhs, "ASSERT_NE", !=) #define ASSERT_NOT_REACHED() Kernel::panic("ASSERT_NOT_REACHED() failed") #else #include #define ASSERT(cond) assert((cond) && "ASSERT("#cond") failed") #define ASSERT_NOT_REACHED() do { assert(false && "ASSERT_NOT_REACHED() failed"); __builtin_unreachable(); } while (false) -#endif \ No newline at end of file +#endif