STX  1.0.0
config.h
Go to the documentation of this file.
1 
30 #pragma once
31 
33 #define CFG(param, value) STX_##param##_##value
34 
35 /*********************** COMPILERS ***********************/
36 
37 #if defined(__GNUC__) // any compiler that implements the GNU compiler
38  // extensions
39 #define STX_COMPILER_GNUC 1
40 #else
41 #define STX_COMPILER_GNUC 0
42 #endif
43 
44 #if defined(__clang__)
45 #define STX_COMPILER_CLANG 1
46 #else
47 #define STX_COMPILER_CLANG 0
48 #endif
49 
50 #if defined(_MSC_VER)
51 #define STX_COMPILER_MSVC 1
52 #else
53 #define STX_COMPILER_MSVC 0
54 #endif
55 
56 #if defined(__EMSCRIPTEN__)
57 #define STX_COMPILER_EMSCRIPTEN 1
58 #else
59 #define STX_COMPILER_EMSCRIPTEN 0
60 #endif
61 
62 #if defined(__NVCC__)
63 #define STX_COMPILER_NVCC 1
64 #else
65 #define STX_COMPILER_NVCC 0
66 #endif
67 
68 #if defined(__CC_ARM)
69 #define STX_COMPILER_ARM 1
70 #else
71 #define STX_COMPILER_ARM 0
72 #endif
73 
74 #if defined(__INTEL_COMPILER) || defined(__ICL)
75 #define STX_COMPILER_INTEL 1
76 #else
77 #define STX_COMPILER_INTEL 0
78 #endif
79 
80 #if defined(__MINGW32__) || defined(__MINGW64__)
81 #define STX_COMPILER_MINGW 1
82 #else
83 #define STX_COMPILER_MINGW 0
84 #endif
85 
86 /*********************** OPERATING SYSTEMS ***********************/
87 
88 #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || \
89  defined(WIN32) // Any Windows
90 #define STX_OS_WINDOWS 1
91 #else
92 #define STX_OS_WINDOWS 0
93 #endif
94 
95 #if defined(__unix__) || defined(unix) // UNIX
96 #define STX_OS_UNIX 1
97 #else
98 #define STX_OS_UNIX 0
99 #endif
100 
101 #if __has_include(<unistd.h>) // Posix-compliant operating system
102 #define STX_OS_POSIX 1
103 #else
104 #define STX_OS_POSIX 0
105 #endif
106 
107 #if defined(__linux__) || defined(__linux) || \
108  defined(linux) // Linux and variants like Android
109 #define STX_OS_LINUX 1
110 #else
111 #define STX_OS_LINUX 0
112 #endif
113 
114 #if defined(__gnu_linux__) // Linux OS with GNU facilities
115 #define STX_OS_GNU_LINUX 1
116 #else
117 #define STX_OS_GNU_LINUX 0
118 #endif
119 
120 #if defined(__ANDROID__) // Android, Also infers STX_OS_LINUX
121 #define STX_OS_ANDROID 1
122 #else
123 #define STX_OS_ANDROID 0
124 #endif
125 
126 #if defined(__APPLE__) // All Apple OSs
127 #define STX_OS_APPLE 1
128 
129 #include <Availability.h>
130 #include <TargetConditionals.h>
131 
132 #else
133 #define STX_OS_APPLE 0
134 #endif
135 
136 #if defined(__APPLE__) && defined(__MACH__) // Mac OS X
137 #define STX_OS_MACOS 1
138 #else
139 #define STX_OS_MACOS 0
140 #endif
141 
142 // TODO(lamarrr): add Apple targets from TargetConditional.h
143 
144 #if defined(__wasi__) // WebAssembly System Interface
145 #define STX_OS_WASI 1
146 #else
147 #define STX_OS_WASI 0
148 #endif
149 
150 #if defined(__CYGWIN__) // Cygwin environment
151 #define STX_OS_CYGWIN 1
152 #else
153 #define STX_OS_CYGWIN 0
154 #endif
155 
156 #if defined(__Fuchsia__) // Fuchsia
157 #define STX_OS_FUCHSIA 1
158 #else
159 #define STX_OS_FUCHSIA 0
160 #endif
161 
162 /*********************** ARCHITECTURES ***********************/
163 
164 #if defined(__i386__) || defined(__i386) || defined(_X86_) || \
165  defined(_M_IX86) || defined(_M_I86) // X86
166 #define STX_ARCH_X86 1
167 #else
168 #define STX_ARCH_X86 0
169 #endif
170 
171 #if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || \
172  defined(_M_AMD64) || defined(__amd64) || defined(__amd64__) // X86_64
173 #define STX_ARCH_X86_64 1
174 #else
175 #define STX_ARCH_X86_64 0
176 #endif
177 
178 #if defined(__arm__) || defined(_M_ARM) // ARM
179 #define STX_ARCH_ARM32 1
180 #else
181 #define STX_ARCH_ARM32 0
182 #endif
183 
184 #if defined(__aarch64__) // ARM64
185 #define STX_ARCH_ARM64 1
186 #else
187 #define STX_ARCH_ARM64 0
188 #endif
189 
190 #if defined(__XTENSA__) // Xtensa
191 #define STX_ARCH_XTENSA 1
192 #else
193 #define STX_ARCH_XTENSA 0
194 #endif
195 
196 #if defined(__mips__) || defined(__mips) || defined(mips) || \
197  defined(__MIPS__) // MIPS
198 #define STX_ARCH_MIPS 1
199 #else
200 #define STX_ARCH_MIPS 0
201 #endif
202 
203 #if defined(__riscv) || defined(__riscv__) // RISC-V
204 #define STX_ARCH_RISCV 1
205 #else
206 #define STX_ARCH_RISCV 0
207 #endif
208 
209 /************ FEATURE AND LIBRARY REQUIREMENTS ************/
210 
211 #if defined __has_builtin
212 #define STX_HAS_BUILTIN(feature) __has_builtin(__builtin_##feature)
213 #else
214 #define STX_HAS_BUILTIN(feature) 0
215 #endif
216 
217 // From non-trivial constexpr paper
218 #if __cpp_constexpr >= 201807L
219 #define STX_CXX20_DESTRUCTOR_CONSTEXPR constexpr
222 #define STX_RESULT_CONSTEXPR 1
225 #define STX_OPTION_CONSTEXPR 1
228 #else
229 #define STX_CXX20_DESTRUCTOR_CONSTEXPR
232 #define STX_RESULT_CONSTEXPR 0
235 #define STX_OPTION_CONSTEXPR 0
238 #endif
239 
240 /*********************** UTILITY MACROS ***********************/
241 
242 // also used for hiding static variables and hookable functions that should not
243 // be touched but should reside in the binary
244 // GNUC doesn't mean GCC!, it's also present in clang
245 #if __has_cpp_attribute(gnu::always_inline)
246 #define STX_FORCE_INLINE [[gnu::always_inline]] inline
247 #else
248 #if CFG(COMPILER, MSVC)
249 #define STX_FORCE_INLINE __forceinline
250 #else
251 #if CFG(COMPILER, NVCC)
252 #define STX_FORCE_INLINE __forcinline__
253 #else
254 #define STX_FORCE_INLINE inline
255 #endif
256 #endif
257 #endif
258 
259 /*********************** ATTRIBUTE REQUIREMENTS ***********************/
260 
261 #if !__has_cpp_attribute(nodiscard)
262 #error C++ attribute `nodiscard` is not available on this compiler. Important unused function results will not raise a warning. Please upgrade to a newer version.
263 #endif
264 
265 #if !__has_cpp_attribute(deprecated)
266 #error C++ attribute `deprecated` is not available on this compiler. Please upgrade to a newer version.
267 #endif
268 
269 #if !__has_cpp_attribute(noreturn)
270 #error C++ function attribute `noreturn` is not available on this compiler. Please upgrade to a newer version.
271 #endif
272 
273 /*********************** SHARED LIBRARY SUPPORT ***********************/
274 
275 #if CFG(OS, WINDOWS) || CFG(OS, CYGWIN)
276 #define STX_IMPORT __declspec(dllimport)
277 #define STX_EXPORT __declspec(dllexport)
278 #define STX_LOCAL
279 #else
280 #if __has_cpp_attribute(gnu::visibility)
281 #define STX_IMPORT [[gnu::visibility("default")]]
282 #define STX_EXPORT [[gnu::visibility("default")]]
283 #define STX_LOCAL [[gnu::visibility("hidden")]]
284 #else
285 #define STX_IMPORT
286 #define STX_EXPORT
287 #define STX_LOCAL
288 #endif
289 #endif
290 
291 /*********************** BINARY FORMATS ***********************/
292 
293 #if defined(__wasm__) // Web Assembly
294 #define STX_BINARY_WASW 1
295 #else
296 #define STX_BINARY_WASW 0
297 #endif
298 
299 #if defined(__ELF__) // Executable and Linkable Formats
300 #define STX_BINARY_ELF 1
301 #else
302 #define STX_BINARY_ELF 0
303 #endif
304 
305 #if CFG(OS, WINDOWS) // Windows Portable Executable
306 #define STX_BINARY_EXE 1
307 #else
308 #define STX_BINARY_EXE 0
309 #endif
310 
311 /*********************** TOOLCHAINS ***********************/
312 
313 #if defined(__llvm__)
314 #define STX_TOOLCHAIN_LLVM 1
315 #else
316 #define STX_TOOLCHAIN_LLVM 0
317 #endif
318 
319 /*********************** VERSIONING ***********************/
320 
321 #define STX_VERSION v1
322 
323 #define STX_VERSION_STRING "v1"
324 
325 #define STX_BEGIN_NAMESPACE \
326  namespace stx { \
327  inline namespace v1 {
328 
329 #define STX_END_NAMESPACE \
330  } \
331  }