//! Support Library Assert Wrappers //! //! The Support Library uses its own assertion system which is more flexible than the //! standard C library's assertion macros. //! //! They are not intended to be directly compatible with some of the quirks //! the Standard C library allows (like using assert() as an expression). //! //! They are: //! - BASE_ASSERT() //! - active in debug builds and removed on release //! - BASE_CHECK() //! - always active, even in release builds #pragma once #include namespace base { [[noreturn]] void ExitMsg(const char* message); } // namespace base #ifdef BASE_DEBUG #define BASE_ASSERT(expr, fmt, ...) \ if(!(expr)) [[unlikely]] { \ auto msg = std::format("Assertion \"{}\" @ {}:{} failed with message: {}", #expr, __FILE__, __LINE__, std::format(fmt, ##__VA_ARGS__)); \ ::base::ExitMsg(msg.c_str()); \ __builtin_unreachable(); \ } #else #define BASE_ASSERT(expr, format, ...) #endif #define BASE_CHECK(expr, fmt, ...) \ if(!(expr)) [[unlikely]] { \ auto msg = std::format("Check \"{}\" @ {}:{} failed with message: {}", #expr, __FILE__, __LINE__, std::format(fmt, ##__VA_ARGS__)); \ ::base::ExitMsg(msg.c_str()); \ __builtin_unreachable(); \ }