NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
c++config.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONFIG_CPPCONFIG_HPP__
2#define NEFORCE_CORE_CONFIG_CPPCONFIG_HPP__
3
21
22#include <cassert>
23
29
30#if defined(WIN32) || defined(_WIN32) || defined(_M_X86) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
31
36# define NEFORCE_PLATFORM_WINDOWS 1
37
42# define NEFORCE_PLATFORM_WINDOWS32 1
43
44# if defined(WIN64) || defined(_WIN64) || defined(_M_X64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
49# define NEFORCE_PLATFORM_WINDOWS64 1
50# endif
51#endif
52
53#if defined(__linux__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
58# define NEFORCE_PLATFORM_LINUX 1
59
60# if (__WORDSIZE == 32) || (__SIZEOF_POINTER__ == 4) || defined(NEFORCE_PLATFORM_LINUX64) || \
61 defined(NEXUSFORCE_ENABLE_DOXYGEN)
66# define NEFORCE_PLATFORM_LINUX32 1
67# endif
68
69# if (__WORDSIZE == 64) || (__SIZEOF_POINTER__ == 8) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
74# define NEFORCE_PLATFORM_LINUX64 1
75# endif
76#endif
77
78#if !(defined(NEFORCE_PLATFORM_WINDOWS) || defined(NEFORCE_PLATFORM_LINUX))
79# error "NeForce: 不支持的操作系统"
80#endif
81
82
83#ifdef NEFORCE_PLATFORM_WINDOWS
84
85# ifndef WIN32_LEAN_AND_MEAN
86# define WIN32_LEAN_AND_MEAN
87# endif
88
89# ifndef NOMINMAX
90# define NOMINMAX
91# endif
92
93# ifdef bool
94# undef bool
95# endif
96
97# ifdef true
98# undef true
99# endif
100
101# ifdef false
102# undef false
103# endif
104
105# ifdef max
106# undef max
107# endif
108
109# ifdef min
110# undef min
111# endif
112
113#endif
114 // PlatformDetection
116
122
123#if defined(__clang__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
128# define NEFORCE_COMPILER_CLANG 1
129#endif
130
131#if defined(__GNUC__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
136# define NEFORCE_COMPILER_GNUC 1
137#endif
138
139#if defined(_MSC_VER) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
144# define NEFORCE_COMPILER_MSVC 1
145
146# if defined(NEFORCE_COMPILER_CLANG) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
147# define NEFORCE_COMPILER_CLANG_CL 1
148# endif
149#endif
150
151#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
156# define NEFORCE_COMPILER_GCC 1
157#endif
158
159#if defined(__MINGW32__) || defined(__MINGW64__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
164# define NEFORCE_COMPILER_MINGW 1
165# if defined(NEFORCE_COMPILER_CLANG) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
170# define NEFORCE_COMPILER_LLVM_MINGW 1
171# endif
172#endif
173
174#if !(defined(NEFORCE_COMPILER_GNUC) || defined(NEFORCE_COMPILER_MSVC))
175# error "NeForce: 不支持的编译器"
176#endif
177
178#ifdef __clang_analyzer__
179# define NEFORCE_ANALYZER_CLANG 1
180#endif
181 // CompilerDetection
183
189
190#if defined(NEFORCE_COMPILER_MSVC)
195# define NEFORCE_API_EXPORT_DLL __declspec(dllexport)
200# define NEFORCE_API_IMPORT_DLL __declspec(dllimport)
201#endif
202
203#if defined(NEFORCE_COMPILER_GNUC)
208# define NEFORCE_API_EXPORT
209#endif
210
211#if defined(NEFORCE_COMPILER_GNUC)
212# define NEFORCE_API NEFORCE_API_EXPORT
213#else
214# if defined(NEFORCE_DLLEXPORTS)
215# define NEFORCE_API NEFORCE_API_EXPORT_DLL
216# else
217# define NEFORCE_API NEFORCE_API_IMPORT_DLL
218# endif
219#endif
220 // APIImpExpSpec
222
228
229#if defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) || \
230 defined(__I86__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
231# define NEFORCE_ARCH_X86_32 1
232#endif
233
234#if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(__amd64__) || defined(__amd64) || \
235 defined(_M_AMD64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
236# define NEFORCE_ARCH_X86_64 1
237#endif
238
239#if defined(NEFORCE_ARCH_X86_32) || defined(NEFORCE_ARCH_X86_64)
240# define NEFORCE_ARCH_X86 1
241#endif
242
243
244#if defined(__arm__) || defined(__arm) || defined(_ARM_) || defined(_M_ARM) || defined(__ARM_ARCH) || \
245 defined(__TARGET_ARCH_ARM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
246# define NEFORCE_ARCH_ARM32 1
247#endif
248
249#if defined(__aarch64__) || defined(__aarch64) || defined(_M_ARM64) || defined(__ARM64_ARCH_8__) || \
250 defined(__ARM_ARCH_ISA_A64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
251# define NEFORCE_ARCH_AARCH64 1
252#endif
253
254#if defined(NEFORCE_ARCH_ARM32) || defined(NEFORCE_ARCH_AARCH64)
255# define NEFORCE_ARCH_ARM 1
256#endif
257
258
259#if defined(__riscv) || defined(__riscv__) || defined(riscv) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
260# define NEFORCE_ARCH_RISCV 1
261# if __riscv_xlen == 32 || defined(NEXUSFORCE_ENABLE_DOXYGEN)
262# define NEFORCE_ARCH_RISCV32 1
263# endif
264# if __riscv_xlen == 64 || defined(NEXUSFORCE_ENABLE_DOXYGEN)
265# define NEFORCE_ARCH_RISCV64 1
266# endif
267#endif
268
269
270#if defined(__loongarch__) || defined(__loongarch) || defined(__loongarch32) || defined(__loongarch64) || \
271 defined(_LOONGARCH_SIM) || defined(_LOONGARCH) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
272# define NEFORCE_ARCH_LOONGARCH 1
273# if defined(__loongarch32) || defined(_LOONGARCH_SIM == _ABILP32_SIM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
274# define NEFORCE_ARCH_LOONGARCH32 1
275# endif
276# if defined(__loongarch64) || defined(_LOONGARCH_SIM == _ABILP64_SIM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
277# define NEFORCE_ARCH_LOONGARCH64 1
278# endif
279#endif
280
281#if !(defined(NEFORCE_ARCH_X86) || defined(NEFORCE_ARCH_ARM) || defined(NEFORCE_ARCH_RISCV) || \
282 defined(NEFORCE_ARCH_LOONGARCH))
283# error "NeForce: 不支持的指令集"
284#endif
285 // ArchitectureDetection
287
293
294#if defined(NEFORCE_ARCH_X86_64) || defined(NEFORCE_ARCH_AARCH64) || defined(NEFORCE_ARCH_RISCV64) || \
295 defined(NEFORCE_ARCH_LOONGARCH64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
300# define NEFORCE_ARCH_BITS_64 1
301#endif
302#if defined(NEFORCE_ARCH_X86_32) || defined(NEFORCE_ARCH_ARM32) || defined(NEFORCE_ARCH_RISCV32) || \
303 defined(NEFORCE_ARCH_LOONGARCH32) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
308# define NEFORCE_ARCH_BITS_32 1
309#endif
310
311#if !(defined(NEFORCE_ARCH_BITS_64) || defined(NEFORCE_ARCH_BITS_32))
312# error "NeForce: 不支持的位宽"
313#endif
314 // DataBusWidth
316
317
318#if defined(NEFORCE_ARCH_X86) && defined(NEFORCE_USING_INTEL_TSX)
319# define NEFORCE_SUPPORT_INTEL_TSX 1
320#endif
321
322#ifdef NEFORCE_ARCH_BITS_64
323# define NEFORCE_SUPPORT_INTRINSIC_INT128 1
324#endif
325
326
332
333#if (__cplusplus >= 202100L) || (_MSVC_LANG >= 202100L)
338# define NEFORCE_STANDARD_23 1
339#endif
340#if (__cplusplus >= 202002L) || defined(NEFORCE_STANDARD_23) || (_MSVC_LANG >= 202002L)
345# define NEFORCE_STANDARD_20 1
346#endif
347#if (__cplusplus >= 201703L) || defined(NEFORCE_STANDARD_20) || (_MSVC_LANG >= 201703L)
352# define NEFORCE_STANDARD_17 1
353#endif
354#if (__cplusplus >= 201402L) || defined(NEFORCE_STANDARD_17) || (_MSVC_LANG >= 201402L)
359# define NEFORCE_STANDARD_14 1
360#endif
361#if (__cplusplus >= 201103L) || defined(NEFORCE_STANDARD_14) || (_MSVC_LANG >= 201103L)
366# define NEFORCE_STANDARD_11 1
367#endif
368#if (__cplusplus >= 199711L) || defined(NEFORCE_STANDARD_11) || (_MSVC_LANG >= 199711L)
373# define NEFORCE_STANDARD_98 1
374#endif
375 // CxxStandardDetection
377
378
379#define __NEFORCE_GLOBAL_NAMESPACE__ neforce
380#define NEFORCE_BEGIN_NAMESPACE__ namespace __NEFORCE_GLOBAL_NAMESPACE__ {
381#define NEFORCE_END_NAMESPACE__ }
382#define _NEFORCE __NEFORCE_GLOBAL_NAMESPACE__ ::
383
384#define __NEFORCE_INNER_NAMESPACE__ inner
385#define NEFORCE_BEGIN_INNER__ namespace __NEFORCE_INNER_NAMESPACE__ {
386#define NEFORCE_END_INNER__ }
387
388#define __NEFORCE_CONSTANTS_NAMESPACE__ constants
389#define NEFORCE_BEGIN_CONSTANTS__ namespace __NEFORCE_CONSTANTS_NAMESPACE__ {
390#define NEFORCE_END_CONSTANTS__ }
391
392#define __NEFORCE_THIS_THREAD_NAMESPACE__ this_thread
393#define NEFORCE_BEGIN_THIS_THREAD__ namespace __NEFORCE_THIS_THREAD_NAMESPACE__ {
394#define NEFORCE_END_THIS_THREAD__ }
395
396#define __NEFORCE_RANGES_NAMESPACE__ ranges
397#define NEFORCE_BEGIN_RANGES__ namespace __NEFORCE_RANGES_NAMESPACE__ {
398#define NEFORCE_END_RANGES__ }
399
400#define __NEFORCE_RANGES_VIEWS_NAMESPACE__ views
401#define NEFORCE_BEGIN_RANGES_VIEWS__ namespace __NEFORCE_RANGES_VIEWS_NAMESPACE__ {
402#define NEFORCE_END_RANGES_VIEWS__ }
403
404#define __NEFORCE_LITERALS_NAMESPACE__ literals
405#define NEFORCE_BEGIN_LITERALS__ inline namespace __NEFORCE_LITERALS_NAMESPACE__ {
406#define NEFORCE_END_LITERALS__ }
407
408#define __NEFORCE_REFLECT_NAMESPACE__ reflect
409#define NEFORCE_BEGIN_REFLECT__ namespace __NEFORCE_REFLECT_NAMESPACE__ {
410#define NEFORCE_END_REFLECT__ }
411
412#define __NEFORCE_HTTP_NAMESPACE__ http
413#define NEFORCE_BEGIN_HTTP__ namespace __NEFORCE_HTTP_NAMESPACE__ {
414#define NEFORCE_END_HTTP__ }
415
416
417#ifdef NEFORCE_STANDARD_11
418# define NEFORCE_CONSTEXPR11 constexpr
419#else
420# define NEFORCE_CONSTEXPR11 inline
421#endif // NEFORCE_STANDARD_11
422
423#ifdef NEFORCE_STANDARD_14
424# define NEFORCE_CONSTEXPR14 constexpr
425#else
426# define NEFORCE_CONSTEXPR14 inline
427#endif // NEFORCE_STANDARD_14
428
429#ifdef NEFORCE_STANDARD_17
430# define NEFORCE_CONSTEXPR17 constexpr
431# define NEFORCE_INLINE17 inline
432#else
433# define NEFORCE_CONSTEXPR17 inline
434# define NEFORCE_INLINE17
435#endif // NEFORCE_STANDARD_17
436
437#ifdef NEFORCE_STANDARD_20
438# define NEFORCE_CONSTEXPR20 constexpr
439#else
440# define NEFORCE_CONSTEXPR20 inline
441#endif // NEFORCE_STANDARD_20
442
443#ifdef NEFORCE_STANDARD_23
444# define NEFORCE_CONSTEXPR23 constexpr
445#else
446# define NEFORCE_CONSTEXPR23 inline
447#endif // NEFORCE_STANDARD_23
448
449
450#ifdef NEFORCE_STANDARD_17
451# define NEFORCE_IF_CONSTEXPR if constexpr
452#else
453# define NEFORCE_IF_CONSTEXPR if
454#endif
455
456
457#ifdef NEFORCE_STANDARD_17
458# define NEFORCE_NODISCARD [[nodiscard]]
459
460# define NEFORCE_ALLOC_NODISCARD [[nodiscard("discard the return of allocators will cause memory leaks.")]]
461#else
462# define NEFORCE_NODISCARD
463
464# define NEFORCE_ALLOC_NODISCARD
465#endif
466
467
468#ifdef NEFORCE_COMPILER_GNUC
469# define NEFORCE_ALWAYS_INLINE __attribute__((always_inline))
470# define NEFORCE_ALWAYS_INLINE_INLINE NEFORCE_ALWAYS_INLINE inline
471#elif defined(NEFORCE_COMPILER_MSVC)
472# define NEFORCE_ALWAYS_INLINE __forceinline
473# define NEFORCE_ALWAYS_INLINE_INLINE NEFORCE_ALWAYS_INLINE
474#else
475# define NEFORCE_ALWAYS_INLINE inline
476# define NEFORCE_ALWAYS_INLINE_INLINE inline
477#endif
478
479
480#ifdef NEFORCE_COMPILER_GNUC
481# define NEFORCE_UNUSED __attribute__((unused))
482#else
483# define NEFORCE_UNUSED
484#endif
485
486
487#ifdef NEFORCE_STANDARD_17
488# define NEFORCE_UNLIKELY [[unlikely]]
489#else
490# define NEFORCE_UNLIKELY
491#endif
492
493
494#ifdef NEFORCE_STANDARD_20
495# define NEFORCE_LIKELY [[likely]]
496#else
497# define NEFORCE_LIKELY
498#endif
499
500
501#if defined(NEFORCE_STANDARD_11)
502# define NEFORCE_NORETURN [[noreturn]]
503#elif defined(NEFORCE_COMPILER_GNUC)
504# define NEFORCE_NORETURN __attribute__((noreturn))
505#elif defined(NEFORCE_COMPILER_MSVC)
506# define NEFORCE_NORETURN __declspec(noreturn)
507#else
508# define NEFORCE_NORETURN
509#endif
510
511
512#ifndef NEFORCE_COMPILER_GNUC
513# define NEFORCE_PURE_FUNCTION
514# define NEFORCE_CONST_FUNCTION
515#else
516# define NEFORCE_PURE_FUNCTION __attribute__((__pure__))
517# define NEFORCE_CONST_FUNCTION __attribute__((__const__))
518#endif
519
520
521#ifdef NEFORCE_STANDARD_14
522# define NEFORCE_DEPRECATED [[deprecated]]
523# define NEFORCE_DEPRECATED_FOR(MSG) [[deprecated(MSG)]]
524#else
525# define NEFORCE_DEPRECATED
526# define NEFORCE_DEPRECATED_FOR(MSG)
527#endif
528
529
530#if defined(NEFORCE_COMPILER_GNUC)
531# define NEFORCE_NOVTABLE __attribute__((novtable))
532#elif defined(NEFORCE_COMPILER_MSVC)
533# define NEFORCE_NOVTABLE __declspec(novtable)
534#else
535# define NEFORCE_NOVTABLE
536#endif
537
538
539#if defined(NEFORCE_COMPILER_GNUC)
540# define NEFORCE_ALLOC_OPTIMIZE NEFORCE_ALWAYS_INLINE
541#elif defined(NEFORCE_COMPILER_MSVC)
542# define NEFORCE_ALLOC_OPTIMIZE __declspec(allocator)
543#else
544# define NEFORCE_ALLOC_OPTIMIZE
545#endif
546
547
548#if defined(NEFORCE_COMPILER_GNUC)
549# define NEFORCE_RESTRICT __restrict__
550#else
551# define NEFORCE_RESTRICT __restrict
552#endif
553
554
562
563#ifdef NEFORCE_STANDARD_20
568# define NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC) \
569 MAC(char8_t) \
570 MAC(char16_t) \
571 MAC(char32_t)
572#else
573# define NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC) \
574 MAC(char16_t) \
575 MAC(char32_t)
576#endif
577
582#define NEFORCE_MACRO_RANGE_CHARS(MAC) \
583 MAC(char) \
584 MAC(wchar_t) \
585 NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC)
586
591#define NEFORCE_MACRO_RANGE_SIGNED_INT(MAC) \
592 MAC(signed char) \
593 MAC(short) \
594 MAC(int) \
595 MAC(long) \
596 MAC(long long)
597
602#define NEFORCE_MACRO_RANGE_UNSIGNED_INT(MAC) \
603 MAC(unsigned char) \
604 MAC(unsigned short) \
605 MAC(unsigned int) \
606 MAC(unsigned long) \
607 MAC(unsigned long long)
608
613#define NEFORCE_MACRO_RANGE_INT(MAC) \
614 NEFORCE_MACRO_RANGE_SIGNED_INT(MAC) \
615 NEFORCE_MACRO_RANGE_UNSIGNED_INT(MAC)
616
621#define NEFORCE_MACRO_RANGE_FLOAT(MAC) \
622 MAC(float) \
623 MAC(double) \
624 MAC(long double)
625
630#define NEFORCE_MACRO_RANGE_ARITHMETIC(MAC) \
631 NEFORCE_MACRO_RANGE_CHARS(MAC) \
632 NEFORCE_MACRO_RANGE_INT(MAC) \
633 NEFORCE_MACRO_RANGE_FLOAT(MAC)
634
639#define NEFORCE_MACRO_RANGES_CV(MAC) \
640 MAC(const) \
641 MAC(volatile) \
642 MAC(const volatile)
643
648#define NEFORCE_MACRO_RANGES_CV_REF(MAC) \
649 MAC(&) \
650 MAC(const&) \
651 MAC(volatile&) \
652 MAC(const volatile&) \
653 MAC(&&) \
654 MAC(const&&) \
655 MAC(volatile&&) \
656 MAC(const volatile&&)
657
662#define NEFORCE_MACRO_RANGES_CV_REF_NOEXCEPT(MAC) \
663 MAC(noexcept) \
664 MAC(const noexcept) \
665 MAC(volatile noexcept) \
666 MAC(const volatile noexcept) \
667 MAC(& noexcept) \
668 MAC(const& noexcept) \
669 MAC(volatile& noexcept) \
670 MAC(const volatile& noexcept) \
671 MAC(&& noexcept) \
672 MAC(const&& noexcept) \
673 MAC(volatile&& noexcept) \
674 MAC(const volatile&& noexcept)
675 // TypeRangeMacros
677
678#endif // NEFORCE_CORE_CONFIG_CPPCONFIG_HPP__