TPDE
Loading...
Searching...
No Matches
base.hpp
1// SPDX-FileCopyrightText: 2025 Contributors to TPDE <https://tpde.org>
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
5#pragma once
6#include <cstdint>
7
8// TODO: basic stuff like asserts etc...
9
10#ifdef TPDE_ASSERTS
11 // make sure this always works even if NDEBUG is set
12 #ifdef NDEBUG
13 #undef NDEBUG
14 #include <cassert>
15 #define NDEBUG
16 #else
17 #include <cassert>
18 #endif
19#else
20 #undef assert
21 #define assert(x) (void)(x)
22#endif
23
24#ifdef TPDE_LOGGING
25 #include <spdlog/spdlog.h>
26 #define TPDE_LOG(level, ...) \
27 (spdlog::should_log(level) ? spdlog::log(level, __VA_ARGS__) : (void)0)
28 #ifndef NDEBUG
29 #define TPDE_LOG_TRACE(...) TPDE_LOG(spdlog::level::trace, __VA_ARGS__)
30 #define TPDE_LOG_DBG(...) TPDE_LOG(spdlog::level::debug, __VA_ARGS__)
31 #else
32 #define TPDE_LOG_TRACE(...)
33 #define TPDE_LOG_DBG(...)
34 #endif
35 #define TPDE_LOG_INFO(...) TPDE_LOG(spdlog::level::info, __VA_ARGS__)
36 #define TPDE_LOG_WARN(...) TPDE_LOG(spdlog::level::warn, __VA_ARGS__)
37 #define TPDE_LOG_ERR(...) TPDE_LOG(spdlog::level::err, __VA_ARGS__)
38#else
39 #define TPDE_LOG_TRACE(...)
40 #define TPDE_LOG_DBG(...)
41 #define TPDE_LOG_INFO(...)
42 #define TPDE_LOG_WARN(...)
43 #define TPDE_LOG_ERR(...)
44#endif
45
46#ifndef NDEBUG
47 #define TPDE_UNREACHABLE(msg) assert(0 && (msg))
48#else
49 #define TPDE_UNREACHABLE(msg) __builtin_unreachable()
50#endif
51#define TPDE_FATAL(msg) ::tpde::fatal_error(msg)
52
53#if __has_cpp_attribute(clang::lifetimebound)
54 #define TPDE_LIFETIMEBOUND [[clang::lifetimebound]]
55#else
56 #define TPDE_LIFETIMEBOUND
57#endif
58
59namespace tpde {
60// NOTE(ts): someone's gonna hate me...
61using u8 = uint8_t;
62using u16 = uint16_t;
63using u32 = uint32_t;
64using u64 = uint64_t;
65
66using i8 = int8_t;
67using i16 = int16_t;
68using i32 = int32_t;
69using i64 = int64_t;
70
71/// Abort program with a fatal error
72[[noreturn]] void fatal_error(const char *msg) noexcept;
73
74} // namespace tpde