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 <assert.h>
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(__GNUC__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
128# define NEFORCE_COMPILER_GNUC 1
129
130# if defined(__clang__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
135# define NEFORCE_COMPILER_CLANG 1
136# endif
137
138# if defined(__MINGW32__) || defined(__MINGW64__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
143# define NEFORCE_COMPILER_MINGW 1
144# endif
145
146# if !(defined(NEFORCE_COMPILER_CLANG) || defined(NEFORCE_COMPILER_MINGW)) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
151# define NEFORCE_COMPILER_GCC 1
152# endif
153#endif
154
155#if defined(_MSC_VER) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
160# define NEFORCE_COMPILER_MSVC 1
161#endif
162
163#if !(defined(NEFORCE_COMPILER_GNUC) || defined(NEFORCE_COMPILER_MSVC))
164# error "NeForce: 不支持的编译器"
165#endif
166
167#ifdef __clang_analyzer__
168# define NEFORCE_ANALYZER_CLANG 1
169#endif
170 // CompilerDetection
172
178
179#if defined(NEFORCE_COMPILER_MSVC) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
184# define NEFORCE_API_EXPORT_DLL __declspec(dllexport)
189# define NEFORCE_API_IMPORT_DLL __declspec(dllimport)
190#endif
191
192#if defined(NEFORCE_COMPILER_GNUC) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
197# define NEFORCE_API_EXPORT
198#endif
199
200#if defined(NEFORCE_COMPILER_GNUC)
201# define NEFORCE_API NEFORCE_API_EXPORT
202#else
203# if defined(NEFORCE_DLLEXPORTS)
204# define NEFORCE_API NEFORCE_API_EXPORT_DLL
205# else
206# define NEFORCE_API NEFORCE_API_IMPORT_DLL
207# endif
208#endif
209 // APIImpExpSpec
211
217
218#if defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) || \
219 defined(__I86__) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
220# define NEFORCE_ARCH_X86_32 1
221#endif
222
223#if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(__amd64__) || defined(__amd64) || \
224 defined(_M_AMD64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
225# define NEFORCE_ARCH_X86_64 1
226#endif
227
228#if defined(NEFORCE_ARCH_X86_32) || defined(NEFORCE_ARCH_X86_64)
229# define NEFORCE_ARCH_X86 1
230#endif
231
232
233#if defined(__arm__) || defined(__arm) || defined(_ARM_) || defined(_M_ARM) || defined(__ARM_ARCH) || \
234 defined(__TARGET_ARCH_ARM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
235# define NEFORCE_ARCH_ARM32 1
236#endif
237
238#if defined(__aarch64__) || defined(__aarch64) || defined(_M_ARM64) || defined(__ARM64_ARCH_8__) || \
239 defined(__ARM_ARCH_ISA_A64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
240# define NEFORCE_ARCH_AARCH64 1
241#endif
242
243#if defined(NEFORCE_ARCH_ARM32) || defined(NEFORCE_ARCH_AARCH64)
244# define NEFORCE_ARCH_ARM 1
245#endif
246
247
248#if defined(__riscv) || defined(__riscv__) || defined(riscv) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
249# define NEFORCE_ARCH_RISCV 1
250# if __riscv_xlen == 32 || defined(NEXUSFORCE_ENABLE_DOXYGEN)
251# define NEFORCE_ARCH_RISCV32 1
252# endif
253# if __riscv_xlen == 64 || defined(NEXUSFORCE_ENABLE_DOXYGEN)
254# define NEFORCE_ARCH_RISCV64 1
255# endif
256#endif
257
258
259#if defined(__loongarch__) || defined(__loongarch) || defined(__loongarch32) || defined(__loongarch64) || \
260 defined(_LOONGARCH_SIM) || defined(_LOONGARCH) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
261# define NEFORCE_ARCH_LOONGARCH 1
262# if defined(__loongarch32) || defined(_LOONGARCH_SIM == _ABILP32_SIM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
263# define NEFORCE_ARCH_LOONGARCH32 1
264# endif
265# if defined(__loongarch64) || defined(_LOONGARCH_SIM == _ABILP64_SIM) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
266# define NEFORCE_ARCH_LOONGARCH64 1
267# endif
268#endif
269
270#if !(defined(NEFORCE_ARCH_X86) || defined(NEFORCE_ARCH_ARM) || defined(NEFORCE_ARCH_RISCV) || \
271 defined(NEFORCE_ARCH_LOONGARCH))
272# error "NeForce: 不支持的指令集"
273#endif
274 // ArchitectureDetection
276
282
283#if defined(NEFORCE_ARCH_X86_64) || defined(NEFORCE_ARCH_AARCH64) || defined(NEFORCE_ARCH_RISCV64) || \
284 defined(NEFORCE_ARCH_LOONGARCH64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
289# define NEFORCE_ARCH_BITS_64 1
290#endif
291#if defined(NEFORCE_ARCH_X86_32) || defined(NEFORCE_ARCH_ARM32) || defined(NEFORCE_ARCH_RISCV32) || \
292 defined(NEFORCE_ARCH_LOONGARCH32) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
297# define NEFORCE_ARCH_BITS_32 1
298#endif
299
300#if !(defined(NEFORCE_ARCH_BITS_64) || defined(NEFORCE_ARCH_BITS_32))
301# error "NeForce: 不支持的位宽"
302#endif
303 // DataBusWidth
305
311
312#if (__cplusplus >= 202100L) || (_MSVC_LANG >= 202100L) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
317# define NEFORCE_STANDARD_23 1
318#endif
319#if (__cplusplus >= 202002L) || defined(NEFORCE_STANDARD_23) || (_MSVC_LANG >= 202002L) || \
320 defined(NEXUSFORCE_ENABLE_DOXYGEN)
325# define NEFORCE_STANDARD_20 1
326#endif
327#if (__cplusplus >= 201703L) || defined(NEFORCE_STANDARD_20) || (_MSVC_LANG >= 201703L) || \
328 defined(NEXUSFORCE_ENABLE_DOXYGEN)
333# define NEFORCE_STANDARD_17 1
334#endif
335#if (__cplusplus >= 201402L) || defined(NEFORCE_STANDARD_17) || (_MSVC_LANG >= 201402L) || \
336 defined(NEXUSFORCE_ENABLE_DOXYGEN)
341# define NEFORCE_STANDARD_14 1
342#endif
343#if (__cplusplus >= 201103L) || defined(NEFORCE_STANDARD_14) || (_MSVC_LANG >= 201103L) || \
344 defined(NEXUSFORCE_ENABLE_DOXYGEN)
349# define NEFORCE_STANDARD_11 1
350#endif
351#if (__cplusplus >= 199711L) || defined(NEFORCE_STANDARD_11) || (_MSVC_LANG >= 199711L) || \
352 defined(NEXUSFORCE_ENABLE_DOXYGEN)
357# define NEFORCE_STANDARD_98 1
358#endif
359 // CxxStandardDetection
361
362
363#define __NEFORCE_GLOBAL_NAMESPACE__ neforce
364#define NEFORCE_BEGIN_NAMESPACE__ namespace __NEFORCE_GLOBAL_NAMESPACE__ {
365#define NEFORCE_END_NAMESPACE__ }
366#define _NEFORCE __NEFORCE_GLOBAL_NAMESPACE__ ::
367
368#define __NEFORCE_INNER_NAMESPACE__ inner
369#define NEFORCE_BEGIN_INNER__ namespace __NEFORCE_INNER_NAMESPACE__ {
370#define NEFORCE_END_INNER__ }
371
372#define __NEFORCE_CONSTANTS_NAMESPACE__ constants
373#define NEFORCE_BEGIN_CONSTANTS__ namespace __NEFORCE_CONSTANTS_NAMESPACE__ {
374#define NEFORCE_END_CONSTANTS__ }
375
376#define __NEFORCE_THIS_THREAD_NAMESPACE__ this_thread
377#define NEFORCE_BEGIN_THIS_THREAD__ namespace __NEFORCE_THIS_THREAD_NAMESPACE__ {
378#define NEFORCE_END_THIS_THREAD__ }
379
380#define __NEFORCE_RANGES_NAMESPACE__ ranges
381#define NEFORCE_BEGIN_RANGES__ namespace __NEFORCE_RANGES_NAMESPACE__ {
382#define NEFORCE_END_RANGES__ }
383
384#define __NEFORCE_RANGES_VIEWS_NAMESPACE__ views
385#define NEFORCE_BEGIN_RANGES_VIEWS__ namespace __NEFORCE_RANGES_VIEWS_NAMESPACE__ {
386#define NEFORCE_END_RANGES_VIEWS__ }
387
388#define __NEFORCE_LITERALS_NAMESPACE__ literals
389#define NEFORCE_BEGIN_LITERALS__ inline namespace __NEFORCE_LITERALS_NAMESPACE__ {
390#define NEFORCE_END_LITERALS__ }
391
392#define __NEFORCE_REFLECT_NAMESPACE__ reflect
393#define NEFORCE_BEGIN_REFLECT__ namespace __NEFORCE_REFLECT_NAMESPACE__ {
394#define NEFORCE_END_REFLECT__ }
395
396#define __NEFORCE_HTTP_NAMESPACE__ http
397#define NEFORCE_BEGIN_HTTP__ namespace __NEFORCE_HTTP_NAMESPACE__ {
398#define NEFORCE_END_HTTP__ }
399
400
401#ifdef NEFORCE_STANDARD_11
402# define NEFORCE_CONSTEXPR11 constexpr
403#else
404# define NEFORCE_CONSTEXPR11 inline
405#endif // NEFORCE_STANDARD_11
406
407#ifdef NEFORCE_STANDARD_14
408# define NEFORCE_CONSTEXPR14 constexpr
409#else
410# define NEFORCE_CONSTEXPR14 inline
411#endif // NEFORCE_STANDARD_14
412
413#ifdef NEFORCE_STANDARD_17
414# define NEFORCE_CONSTEXPR17 constexpr
415# define NEFORCE_INLINE17 inline
416#else
417# define NEFORCE_CONSTEXPR17 inline
418# define NEFORCE_INLINE17
419#endif // NEFORCE_STANDARD_17
420
421#ifdef NEFORCE_STANDARD_20
422# define NEFORCE_CONSTEXPR20 constexpr
423#else
424# define NEFORCE_CONSTEXPR20 inline
425#endif // NEFORCE_STANDARD_20
426
427#ifdef NEFORCE_STANDARD_23
428# define NEFORCE_CONSTEXPR23 constexpr
429#else
430# define NEFORCE_CONSTEXPR23 inline
431#endif // NEFORCE_STANDARD_23
432
433
434#ifdef NEFORCE_STANDARD_17
435# define NEFORCE_IF_CONSTEXPR if constexpr
436#else
437# define NEFORCE_IF_CONSTEXPR if
438#endif
439
440
441#ifdef NEFORCE_STANDARD_17
442# define NEFORCE_NODISCARD [[nodiscard]]
443
444# define NEFORCE_ALLOC_NODISCARD [[nodiscard("discard the return of allocators will cause memory leaks.")]]
445#else
446# define NEFORCE_NODISCARD
447
448# define NEFORCE_ALLOC_NODISCARD
449#endif
450
451
452#ifdef NEXUSFORCE_ENABLE_DOXYGEN
453# define NEFORCE_ALWAYS_INLINE inline
454# define NEFORCE_ALWAYS_INLINE_INLINE inline
455#elif defined(NEFORCE_COMPILER_GNUC)
456# define NEFORCE_ALWAYS_INLINE __attribute__((always_inline))
457# define NEFORCE_ALWAYS_INLINE_INLINE NEFORCE_ALWAYS_INLINE inline
458#elif defined(NEFORCE_COMPILER_MSVC)
459# define NEFORCE_ALWAYS_INLINE __forceinline
460# define NEFORCE_ALWAYS_INLINE_INLINE NEFORCE_ALWAYS_INLINE
461#else
462# define NEFORCE_ALWAYS_INLINE inline
463# define NEFORCE_ALWAYS_INLINE_INLINE inline
464#endif
465
466
467#ifdef NEFORCE_COMPILER_GNUC
468# define NEFORCE_UNUSED __attribute__((unused))
469#else
470# define NEFORCE_UNUSED
471#endif
472
473
474#ifdef NEFORCE_STANDARD_17
475# define NEFORCE_UNLIKELY [[unlikely]]
476#else
477# define NEFORCE_UNLIKELY
478#endif
479
480
481#ifdef NEFORCE_STANDARD_20
482# define NEFORCE_LIKELY [[likely]]
483#else
484# define NEFORCE_LIKELY
485#endif
486
487
488#if defined(NEFORCE_STANDARD_11)
489# define NEFORCE_NORETURN [[noreturn]]
490#elif defined(NEFORCE_COMPILER_GNUC)
491# define NEFORCE_NORETURN __attribute__((noreturn))
492#elif defined(NEFORCE_COMPILER_MSVC)
493# define NEFORCE_NORETURN __declspec(noreturn)
494#else
495# define NEFORCE_NORETURN
496#endif
497
498
499#if !defined(NEFORCE_COMPILER_GNUC) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
500# define NEFORCE_PURE_FUNCTION
501# define NEFORCE_CONST_FUNCTION
502#else
503# define NEFORCE_PURE_FUNCTION __attribute__((__pure__))
504# define NEFORCE_CONST_FUNCTION __attribute__((__const__))
505#endif
506
507
508#ifdef NEFORCE_STANDARD_14
509# define NEFORCE_DEPRECATED [[deprecated]]
510# define NEFORCE_DEPRECATED_FOR(MSG) [[deprecated(MSG)]]
511#else
512# define NEFORCE_DEPRECATED
513# define NEFORCE_DEPRECATED_FOR(MSG)
514#endif
515
516
517#if defined(NEFORCE_COMPILER_GNUC)
518# define NEFORCE_NOVTABLE __attribute__((novtable))
519#elif defined(NEFORCE_COMPILER_MSVC)
520# define NEFORCE_NOVTABLE __declspec(novtable)
521#else
522# define NEFORCE_NOVTABLE
523#endif
524
525
526#if defined(NEFORCE_COMPILER_GNUC)
527# define NEFORCE_ALLOC_OPTIMIZE NEFORCE_ALWAYS_INLINE
528#elif defined(NEFORCE_COMPILER_MSVC)
529# define NEFORCE_ALLOC_OPTIMIZE __declspec(allocator)
530#else
531# define NEFORCE_ALLOC_OPTIMIZE
532#endif
533
534
535#if defined(NEFORCE_COMPILER_GNUC)
536# define NEFORCE_RESTRICT __restrict__
537#else
538# define NEFORCE_RESTRICT __restrict
539#endif
540
541
549
550#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
555# define NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC) \
556 MAC(char8_t) \
557 MAC(char16_t) \
558 MAC(char32_t)
559#else
560# define NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC) \
561 MAC(char16_t) \
562 MAC(char32_t)
563#endif
564
569#define NEFORCE_MACRO_RANGE_CHARS(MAC) \
570 MAC(char) \
571 MAC(wchar_t) \
572 NEFORCE_MACRO_RANGE_UNICODE_CHARS(MAC)
573
578#define NEFORCE_MACRO_RANGE_SIGNED_INT(MAC) \
579 MAC(signed char) \
580 MAC(short) \
581 MAC(int) \
582 MAC(long) \
583 MAC(long long)
584
589#define NEFORCE_MACRO_RANGE_UNSIGNED_INT(MAC) \
590 MAC(unsigned char) \
591 MAC(unsigned short) \
592 MAC(unsigned int) \
593 MAC(unsigned long) \
594 MAC(unsigned long long)
595
600#define NEFORCE_MACRO_RANGE_INT(MAC) \
601 NEFORCE_MACRO_RANGE_SIGNED_INT(MAC) \
602 NEFORCE_MACRO_RANGE_UNSIGNED_INT(MAC)
603
608#define NEFORCE_MACRO_RANGE_FLOAT(MAC) \
609 MAC(float) \
610 MAC(double) \
611 MAC(long double)
612
617#define NEFORCE_MACRO_RANGE_ARITHMETIC(MAC) \
618 NEFORCE_MACRO_RANGE_CHARS(MAC) \
619 NEFORCE_MACRO_RANGE_INT(MAC) \
620 NEFORCE_MACRO_RANGE_FLOAT(MAC)
621
626#define NEFORCE_MACRO_RANGES_CV(MAC) \
627 MAC(const) \
628 MAC(volatile) \
629 MAC(const volatile)
630
635#define NEFORCE_MACRO_RANGES_CV_REF(MAC) \
636 MAC(&) \
637 MAC(const&) \
638 MAC(volatile&) \
639 MAC(const volatile&) \
640 MAC(&&) \
641 MAC(const&&) \
642 MAC(volatile&&) \
643 MAC(const volatile&&)
644
649#define NEFORCE_MACRO_RANGES_CV_REF_NOEXCEPT(MAC) \
650 MAC(noexcept) \
651 MAC(const noexcept) \
652 MAC(volatile noexcept) \
653 MAC(const volatile noexcept) \
654 MAC(& noexcept) \
655 MAC(const& noexcept) \
656 MAC(volatile& noexcept) \
657 MAC(const volatile& noexcept) \
658 MAC(&& noexcept) \
659 MAC(const&& noexcept) \
660 MAC(volatile&& noexcept) \
661 MAC(const volatile&& noexcept)
662 // TypeRangeMacros
664
665#endif // NEFORCE_CORE_CONFIG_CPPCONFIG_HPP__