3#include "pixelbullet/application/log.h"
20namespace assert_detail
22inline void TriggerDebugBreak()
42[[noreturn]]
inline void Fail(
const char* file,
int line,
const char* conditionStr)
44 log::Error(
"Assertion '{}' failed at {}:{}", conditionStr, file, line);
45 assert_detail::TriggerDebugBreak();
62template <
typename... Args>
63[[noreturn]]
void Fail(
const char* file,
int line,
const char* conditionStr, fmt::format_string<Args...> msg, Args&&... args)
68 log::Error(msg, std::forward<Args>(args)...);
69 assert_detail::TriggerDebugBreak();
82[[noreturn]]
inline void Panic(
const char* file,
int line)
84 log::Error(
"Panic triggered at {}:{}", file, line);
85 assert_detail::TriggerDebugBreak();
100template <
typename... Args>
101[[noreturn]]
void Panic(
const char* file,
int line, fmt::format_string<Args...> msg, Args&&... args)
105 log::Error(msg, std::forward<Args>(args)...);
106 assert_detail::TriggerDebugBreak();
121 log::Error(
"Reached unreachable code at {}:{}", file, line);
122 assert_detail::TriggerDebugBreak();
138template <
typename... Args>
139[[noreturn]]
void Unreachable(
const char* file,
int line, fmt::format_string<Args...> msg, Args&&... args)
143 log::Error(msg, std::forward<Args>(args)...);
144 assert_detail::TriggerDebugBreak();
163#define ASSERT(condition, ...) \
168 pixelbullet::Fail(__FILE__, __LINE__, #condition __VA_OPT__(, ) __VA_ARGS__); \
181#define DEBUG_ASSERT(condition, ...) ASSERT(condition __VA_OPT__(, ) __VA_ARGS__)
183#define DEBUG_ASSERT(condition, ...) ((void)0)
196#define ASSUME(condition, ...) ASSERT(condition __VA_OPT__(, ) __VA_ARGS__)
199#define ASSUME(condition, ...) __assume(condition)
200#elif defined(__clang__) || defined(__GNUC__)
201#define ASSUME(condition, ...) \
205 __builtin_unreachable(); \
208#define ASSUME(condition, ...) ((void)0)
226 pixelbullet::Panic(__FILE__, __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
238#define UNREACHABLE(...) \
241 pixelbullet::Unreachable(__FILE__, __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
245#define UNREACHABLE(...) __assume(0)
246#elif defined(__clang__) || defined(__GNUC__)
247#define UNREACHABLE(...) __builtin_unreachable()
249#define UNREACHABLE(...) ((void)0)
void Fail(const char *file, int line, const char *conditionStr)
Fails an assertion without a custom message.
Definition assert.h:42
void Unreachable(const char *file, int line)
Handles unreachable code without a custom message.
Definition assert.h:119
void Panic(const char *file, int line)
Triggers a panic without a custom message.
Definition assert.h:82