sandbox
Loading...
Searching...
No Matches
assert.hpp
1#ifndef LIBSBX_UTILITY_ASSERT_HPP_
2#define LIBSBX_UTILITY_ASSERT_HPP_
3
4#include <concepts>
5#include <string_view>
6#include <source_location>
7#include <iostream>
8
9#include <fmt/format.h>
10
11#include <libsbx/utility/target.hpp>
12
13namespace sbx::utility {
14
15template<std::convertible_to<bool> Expression>
16inline auto assert_that(Expression&& expression, std::string_view message, const std::source_location& source_location = std::source_location::current()) -> void {
17 if constexpr (build_configuration_v == build_configuration::debug) {
18 if (!static_cast<bool>(expression)) {
19 const auto error = fmt::format("Assertion '{}' at {}:{} in '{}' failed. Terminating", message, source_location.file_name(), source_location.line(), source_location.function_name());
20 std::cerr.write(error.data(), static_cast<std::streamsize>(error.size()));
21 std::cerr.flush();
22 std::terminate();
23 }
24 }
25}
26
27template<std::convertible_to<bool> Expression>
28inline auto expect_that(Expression&& expression, std::string_view message, const std::source_location& source_location = std::source_location::current()) -> void {
29 if constexpr (build_configuration_v == build_configuration::debug) {
30 if (!static_cast<bool>(expression)) {
31 const auto warning = fmt::format("Expectation '{}' at {}:{} in '{}' failed.", message, source_location.file_name(), source_location.line(), source_location.function_name());
32 std::cerr.write(warning.data(), static_cast<std::streamsize>(warning.size()));
33 std::cerr.flush();
34 }
35 }
36}
37
38} // namespace sbx::utility
39
40#endif // LIBSBX_UTILITY_ASSERT_HPP_