12#define TT_BT_DEBUG 'D'
13#define TT_BT_RELEASE 'R'
16#define TT_BUILD_TYPE TT_BT_RELEASE
18#define TT_BUILD_TYPE TT_BT_DEBUG
23 Release = TT_BT_RELEASE,
25 current = TT_BUILD_TYPE
28#define TT_OS_WINDOWS 'W'
29#define TT_OS_MACOS 'M'
31#define TT_OS_LINUX 'L'
32#define TT_OS_POSIX 'P'
34#define TT_OS_ANDROID 'A'
39#define TT_OPERATING_SYSTEM TT_OS_WINDOWS
41#define TT_OPERATING_SYSTEM TT_OS_WINDOWS
42#elif defined(__APPLE__)
43 #include "TargetConditionals.h"
44 #if TARGET_OS_IPHONE == 1
45 #define TT_OPERATING_SYSTEM TT_OS_IOS
47 #define TT_OPERATING_SYSTEM TT_OS_MACOS
49#elif defined(__ANDROID__)
50#define TT_OPERATING_SYSTEM TT_OS_ANDROID
52#define TT_OPERATING_SYSTEM TT_OS_LINUX
54#define TT_OPERATING_SYSTEM TT_OS_UNIX
56#define TT_OPERATING_SYSTEM TT_OS_POSIX
58#error "Could not detect the operating system."
61enum class OperatingSystem {
62 Windows = TT_OS_WINDOWS,
66 Android = TT_OS_ANDROID,
70 current = TT_OPERATING_SYSTEM
75#define TT_CC_CLANG 'c'
78#define TT_COMPILER TT_CC_CLANG
79#elif defined(_MSC_BUILD)
80#define TT_COMPILER TT_CC_MSVC
81#elif defined(__GNUC__)
82#define TT_COMPILER TT_CC_GCC
84#error "Could not detect the compiler."
98#if defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64)
99#define TT_PROCESSOR TT_CPU_X64
100#elif defined(__arm__) || defined(_M_ARM)
101#define TT_PROCESSOR TT_CPU_ARM
103#error "Could not detect processor."
106enum class Processor {
110 current = TT_PROCESSOR
113#define tt_stringify(a) #a
115#if TT_COMPILER == TT_CC_MSVC
116#define tt_likely(condition) condition
117#define tt_unlikely(condition) condition
118#define tt_unreachable() __assume(0)
119#define tt_assume(condition) __assume(condition)
120#define tt_force_inline __forceinline
121#define tt_no_inline inline __declspec(noinline)
122#define clang_suppress(a)
123#define msvc_suppress(a) _Pragma(tt_stringify(warning(disable:a)))
124#define gsl_suppress(a) [[gsl::suppress(a)]]
125#define gsl_suppress2(a,b) [[gsl::suppress(a)]] [[gsl::suppress(b)]]
126#define gsl_suppress3(a,b,c) [[gsl::suppress(a)]] [[gsl::suppress(b)]] [[gsl::suppress(c)]]
127#define gsl_suppress4(a,b,c,d) [[gsl::suppress(a)]] [[gsl::suppress(b)]] [[gsl::suppress(c)]] [[gsl::suppress(d)]]
128#define gsl_suppress5(a,b,c,d,e) [[gsl::suppress(a)]] [[gsl::suppress(b)]] [[gsl::suppress(c)]] [[gsl::suppress(d)]] [[gsl::suppress(e)]]
130#elif TT_COMPILER == TT_CC_CLANG
131#define tt_likely(condition) __builtin_expect(static_cast<bool>(condition), 1)
132#define tt_unlikely(condition) __builtin_expect(static_cast<bool>(condition), 0)
133#define tt_unreachable() __builtin_unreachable()
134#define tt_assume(condition) __builtin_assume(static_cast<bool>(condition))
135#define tt_force_inline inline __attribute__((always_inline))
136#define tt_no_inline inline __attribute__((noinline))
137#define clang_suppress(a) _Pragma(tt_stringify(clang diagnostic ignored a))
138#define msvc_suppress(a)
139#define gsl_suppress(a) [[gsl::suppress(#a)]]
140#define gsl_suppress2(a,b) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]]
141#define gsl_suppress3(a,b,c) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]]
142#define gsl_suppress4(a,b,c,d) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]] [[gsl::suppress(#d)]]
143#define gsl_suppress5(a,b,c,d,e) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]] [[gsl::suppress(#d)]] [[gsl::suppress(#e)]]
145#elif TT_COMPILER == TT_CC_GCC
146#define tt_likely(condition) __builtin_expect(static_cast<bool>(condition), 1)
147#define tt_unlikely(condition) __builtin_expect(static_cast<bool>(condition), 0)
148#define tt_unreachable() __builtin_unreachable()
149#define tt_assume(condition) do { if (!(condition)) tt_unreachable(); } while (false)
150#define tt_force_inline inline __attribute__((always_inline))
151#define tt_no_inline inline __attribute__((noinline))
152#define clang_suppress(a)
153#define msvc_suppress(a)
154#define gsl_suppress(a) [[gsl::suppress(#a)]]
155#define gsl_suppress2(a,b) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]]
156#define gsl_suppress3(a,b,c) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]]
157#define gsl_suppress4(a,b,c,d) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]] [[gsl::suppress(#d)]]
158#define gsl_suppress5(a,b,c,d,e) [[gsl::suppress(#a)]] [[gsl::suppress(#b)]] [[gsl::suppress(#c)]] [[gsl::suppress(#d)]] [[gsl::suppress(#e)]]
161#define tt_likely(condition) condition
162#define tt_unlikely(condition) condition
163#define tt_unreachable() std::terminate()
164#define tt_assume(condition) static_assert(sizeof(condition) == 1)
165#define tt_force_inline inline
167#define clang_suppress(a)
168#define msvc_suppress(a)
169#define gsl_suppress(a)
170#define gsl_suppress2(a,b)
171#define gsl_suppress3(a,b,c)
172#define gsl_suppress4(a,b,c,d)
173#define gsl_suppress5(a,b,c,d,e)
177#if TT_BUILD_TYPE == TT_BT_DEBUG
181#define tt_assume(expression) tt_assert(expression)
184constexpr size_t cache_line_size =
185 Processor::current == Processor::X64 ? 128 :
186 Processor::current == Processor::ARM ? 64 :
192 std::conditional_t<OperatingSystem::current == OperatingSystem::Windows,
void *,
193 std::conditional_t<OperatingSystem::current == OperatingSystem::MacOS,int,