3#include "pixelbullet/core/debug_break.h"
4#include "pixelbullet/logging/log.h"
16namespace pixelbullet::assert_internal
28[[noreturn]]
inline void fail_assertion(
const char* file,
int line,
const char* condition_str)
30 log::error(
"Assertion '{}' failed at {}:{}", condition_str, file, line);
31 platform::debug_break();
48template <
typename... Args>
49[[noreturn]]
void fail_assertion(
const char* file,
int line,
const char* condition_str, fmt::format_string<Args...> msg, Args&&... args)
51 log::error(
"Assertion '{}' failed at {}:{}: {}", condition_str, file, line, fmt::format(msg, std::forward<Args>(args)...));
52 platform::debug_break();
65[[noreturn]]
inline void panic(
const char* file,
int line)
67 log::error(
"Panic triggered at {}:{}", file, line);
68 platform::debug_break();
83template <
typename... Args>
84[[noreturn]]
void panic(
const char* file,
int line, fmt::format_string<Args...> msg, Args&&... args)
86 log::error(
"Panic triggered at {}:{}: {}", file, line, fmt::format(msg, std::forward<Args>(args)...));
87 platform::debug_break();
102 log::error(
"Reached unreachable code at {}:{}", file, line);
103 platform::debug_break();
119template <
typename... Args>
120[[noreturn]]
void unreachable(
const char* file,
int line, fmt::format_string<Args...> msg, Args&&... args)
122 log::error(
"Reached unreachable code at {}:{}: {}", file, line, fmt::format(msg, std::forward<Args>(args)...));
123 platform::debug_break();
142#define ASSERT(condition, ...) \
147 pixelbullet::assert_internal::fail_assertion(__FILE__, __LINE__, #condition __VA_OPT__(, ) __VA_ARGS__); \
160#define DEBUG_ASSERT(condition, ...) ASSERT(condition __VA_OPT__(, ) __VA_ARGS__)
162#define DEBUG_ASSERT(condition, ...) ((void)0)
175#define ASSUME(condition, ...) ASSERT(condition __VA_OPT__(, ) __VA_ARGS__)
178#define ASSUME(condition, ...) __assume(condition)
179#elif defined(__clang__) || defined(__GNUC__)
180#define ASSUME(condition, ...) \
184 __builtin_unreachable(); \
187#define ASSUME(condition, ...) ((void)0)
205 pixelbullet::assert_internal::panic(__FILE__, __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
217#define UNREACHABLE(...) \
220 pixelbullet::assert_internal::unreachable(__FILE__, __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
224#define UNREACHABLE(...) __assume(0)
225#elif defined(__clang__) || defined(__GNUC__)
226#define UNREACHABLE(...) __builtin_unreachable()
228#define UNREACHABLE(...) ((void)0)
void fail_assertion(const char *file, int line, const char *condition_str)
Fails an assertion without a custom message.
Definition assert.h:28
void panic(const char *file, int line)
Triggers a panic without a custom message.
Definition assert.h:65
void unreachable(const char *file, int line)
Handles unreachable code without a custom message.
Definition assert.h:100