106 lines
2.4 KiB
C++
106 lines
2.4 KiB
C++
/*
|
|
* Copyright 2015 - 2025 gary@drinkingtea.net
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#if defined(OX_USE_STDLIB)
|
|
#include <iostream>
|
|
#endif
|
|
|
|
#include "def.hpp"
|
|
#include "defines.hpp"
|
|
#include "error.hpp"
|
|
#include "realstd.hpp"
|
|
#include "stacktrace.hpp"
|
|
#include "trace.hpp"
|
|
#include "typetraits.hpp"
|
|
|
|
namespace ox {
|
|
|
|
[[noreturn]]
|
|
void panic(StringViewCR file, int line, StringViewCR panicMsg, Error const&err = {}) noexcept;
|
|
|
|
[[noreturn]]
|
|
constexpr void constexprPanic(
|
|
StringViewCR file,
|
|
int const line,
|
|
StringViewCR panicMsg,
|
|
Error const&err = {}) noexcept {
|
|
if (!std::is_constant_evaluated()) {
|
|
panic(file, line, panicMsg, err);
|
|
} else {
|
|
while (true);
|
|
}
|
|
}
|
|
|
|
void assertFailFuncRuntime(
|
|
StringViewCR file,
|
|
int line,
|
|
StringViewCR assertTxt,
|
|
StringViewCR msg) noexcept;
|
|
void assertFailFuncRuntime(
|
|
StringViewCR file,
|
|
int line,
|
|
Error const&err,
|
|
StringViewCR,
|
|
StringViewCR assertMsg) noexcept;
|
|
|
|
constexpr void assertFunc(
|
|
StringViewCR file,
|
|
int const line,
|
|
bool const pass,
|
|
[[maybe_unused]]StringViewCR assertTxt,
|
|
[[maybe_unused]]StringViewCR msg) noexcept {
|
|
if (!pass) {
|
|
if (!std::is_constant_evaluated()) {
|
|
assertFailFuncRuntime(file, line, assertTxt, msg);
|
|
} else {
|
|
while (true);
|
|
}
|
|
}
|
|
}
|
|
|
|
constexpr void assertFunc(
|
|
StringViewCR file,
|
|
int const line,
|
|
Error const&err,
|
|
StringViewCR,
|
|
StringViewCR assertMsg) noexcept {
|
|
if (err) {
|
|
if (!std::is_constant_evaluated()) {
|
|
assertFailFuncRuntime(file, line, err, {}, assertMsg);
|
|
} else {
|
|
while (true);
|
|
}
|
|
}
|
|
}
|
|
|
|
constexpr void expect(
|
|
StringViewCR file,
|
|
int const line,
|
|
auto const&actual,
|
|
auto const&expected) noexcept {
|
|
if (actual != expected) {
|
|
if (!std::is_constant_evaluated()) {
|
|
#if defined(OX_USE_STDLIB)
|
|
oxErrf("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, "Value incorrect");
|
|
oxErrf("expected: {}\nactual: {}\n", detail::toStringView<true>(expected), detail::toStringView<true>(actual));
|
|
printStackTrace(2);
|
|
oxTracef("assert.expect", "Failed assert: {} == {} [{}:{}]", detail::toStringView<true>(actual), detail::toStringView<true>(expected), file, line);
|
|
std::abort();
|
|
#else
|
|
constexprPanic(file, line, "Comparison failed");
|
|
#endif
|
|
} else {
|
|
while (true);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|