MSTL
1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
c++config.hpp
浏览该文件的文档.
1
#ifndef MSTL_CORE_CONFIG_CPPCONFIG_HPP__
2
#define MSTL_CORE_CONFIG_CPPCONFIG_HPP__
3
12
13
#include "MSTL/core/config/undef_cmacro.hpp"
14
#include <assert.h>
15
21
22
#if defined(WIN32) || defined(_WIN32) || defined(_M_X86) || defined(MSTL_DOXYGEN_GENERATE)
23
28
#define MSTL_PLATFORM_WINDOWS__ 1
29
34
#define MSTL_PLATFORM_WIN32__ 1
35
36
#if defined(WIN64) || defined(_WIN64) || defined(_M_X64) || defined(MSTL_DOXYGEN_GENERATE)
41
#define MSTL_PLATFORM_WIN64__ 1
42
#endif
43
#endif
44
45
#if defined(__linux__) || defined(MSTL_DOXYGEN_GENERATE)
50
#define MSTL_PLATFORM_LINUX__ 1
51
52
#if (__WORDSIZE == 64) || (__SIZEOF_POINTER__ == 8) || defined(MSTL_DOXYGEN_GENERATE)
57
#define MSTL_PLATFORM_LINUX64__ 1
58
#endif
59
60
#if (__WORDSIZE == 32) || (__SIZEOF_POINTER__ == 4) || defined(MSTL_PLATFORM_LINUX64__) || defined(MSTL_DOXYGEN_GENERATE)
65
#define MSTL_PLATFORM_LINUX32__ 1
66
#endif
67
#endif
68
69
#if !(defined(MSTL_PLATFORM_WINDOWS__) || defined(MSTL_PLATFORM_LINUX__))
70
#error "MSTL: 不支持的操作系统"
71
#endif
72
// PlatformDetection
74
80
81
#ifdef MSTL_PLATFORM_WINDOWS__
82
#ifndef WIN32_LEAN_AND_MEAN
83
#define WIN32_LEAN_AND_MEAN
84
#endif
85
#endif
86
87
88
#if defined(__GNUC__) || defined(MSTL_DOXYGEN_GENERATE)
93
#define MSTL_COMPILER_GNUC__ 1
94
95
#if defined(__clang__) || defined(MSTL_DOXYGEN_GENERATE)
100
#define MSTL_COMPILER_CLANG__ 1
101
#endif
102
103
#if !defined(MSTL_COMPILER_CLANG__) || defined(MSTL_DOXYGEN_GENERATE)
108
#define MSTL_COMPILER_GCC__ 1
109
#endif
110
#endif
111
112
#if defined(_MSC_VER) || defined(MSTL_DOXYGEN_GENERATE)
117
#define MSTL_COMPILER_MSVC__ 1
118
#endif
119
120
#if !(defined(MSTL_COMPILER_GNUC__) || defined(MSTL_COMPILER_MSVC__))
121
#error "MSTL: 不支持的编译器"
122
#endif
123
// CompilerDetection
125
131
132
#if defined(MSTL_COMPILER_MSVC__) || defined(MSTL_DOXYGEN_GENERATE)
137
#define MSTL_API_EXPORT_DLL __declspec(dllexport)
142
#define MSTL_API_IMPORT_DLL __declspec(dllimport)
143
#endif
144
145
#if defined(MSTL_COMPILER_GNUC__) || defined(MSTL_DOXYGEN_GENERATE)
150
#define MSTL_API_EXPORT
151
#endif
152
153
#if defined(MSTL_COMPILER_GNUC__)
154
#define MSTL_API MSTL_API_EXPORT
155
#else
156
#if defined(MSTL_DLLEXPORTS)
157
#define MSTL_API MSTL_API_EXPORT_DLL
158
#else
159
#define MSTL_API MSTL_API_IMPORT_DLL
160
#endif
161
#endif
162
// APIImpExpSpec
164
165
166
#if defined(__i386__) || defined(__i386) || defined(_M_IX86) || \
167
defined(__X86__) || defined(_X86_) || defined(__I86__)
168
#define MSTL_ARCH_X86_32__ 1
169
#endif
170
171
#if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || \
172
defined(__amd64__) || defined(__amd64) || defined(_M_AMD64)
173
#define MSTL_ARCH_X86_64__ 1
174
#endif
175
176
#if defined(MSTL_ARCH_X86_32__) || defined(MSTL_ARCH_X86_64__)
177
#define MSTL_ARCH_X86__ 1
178
#endif
179
180
181
#if defined(__arm__) || defined(__arm) || defined(_ARM_) || \
182
defined(_M_ARM) || defined(__ARM_ARCH) || defined(__TARGET_ARCH_ARM)
183
#define MSTL_ARCH_ARM32__ 1
184
#endif
185
186
#if defined(__aarch64__) || defined(__aarch64) || defined(_M_ARM64) || \
187
defined(__ARM64_ARCH_8__) || defined(__ARM_ARCH_ISA_A64)
188
#define MSTL_ARCH_AARCH64__ 1
189
#endif
190
191
#if defined(MSTL_ARCH_ARM32__) || defined(MSTL_ARCH_AARCH64__)
192
#define MSTL_ARCH_ARM__ 1
193
#endif
194
195
196
#if defined(__riscv) || defined(__riscv__) || defined(riscv)
197
#define MSTL_ARCH_RISCV__ 1
198
#if __riscv_xlen == 32
199
#define MSTL_ARCH_RISCV32__ 1
200
#elif __riscv_xlen == 64
201
#define MSTL_ARCH_RISCV64__ 1
202
#endif
203
#endif
204
205
206
#if defined(__loongarch__) || defined(__loongarch) || \
207
defined(__loongarch32) || defined(__loongarch64) || \
208
defined(_LOONGARCH_SIM) || defined(_LOONGARCH)
209
#define MSTL_ARCH_LOONGARCH__ 1
210
#if defined(__loongarch32) || defined(_LOONGARCH_SIM == _ABILP32_SIM)
211
#define MSTL_ARCH_LOONGARCH32__ 1
212
#elif defined(__loongarch64) || defined(_LOONGARCH_SIM == _ABILP64_SIM)
213
#define MSTL_ARCH_LOONGARCH64__ 1
214
#endif
215
#endif
216
222
223
#if defined(MSTL_ARCH_X86_64__) || defined(MSTL_ARCH_AARCH64__) || defined(MSTL_ARCH_RISCV64__) \
224
|| defined(MSTL_ARCH_LOONGARCH64__) || defined(MSTL_DOXYGEN_GENERATE)
229
#define MSTL_DATA_BUS_WIDTH_64__ 1
230
#endif
231
#if defined(MSTL_ARCH_X86_32__) || defined(MSTL_ARCH_ARM32__) || defined(MSTL_ARCH_RISCV32__) \
232
|| defined(MSTL_ARCH_LOONGARCH32__) || defined(MSTL_DOXYGEN_GENERATE)
237
#define MSTL_DATA_BUS_WIDTH_32__ 1
238
#endif
239
240
#if !(defined(MSTL_DATA_BUS_WIDTH_64__) || defined(MSTL_DATA_BUS_WIDTH_32__))
241
#error "MSTL: 不支持的架构"
242
#endif
243
// DataBusWidth
245
251
256
#define __MSTL_GLOBAL_NAMESPACE__ MSTL
257
262
#define MSTL_BEGIN_NAMESPACE__ namespace __MSTL_GLOBAL_NAMESPACE__ {
263
268
#define MSTL_END_NAMESPACE__ }
269
274
#define _MSTL __MSTL_GLOBAL_NAMESPACE__ ::
275
276
281
#define __MSTL_INNER_NAMESPACE__ inner
282
287
#define MSTL_BEGIN_INNER__ namespace __MSTL_INNER_NAMESPACE__ {
288
293
#define MSTL_END_INNER__ }
294
299
#define _INNER __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_INNER_NAMESPACE__ ::
300
301
306
#define __MSTL_CONSTANTS_NAMESPACE__ constants
307
312
#define MSTL_BEGIN_CONSTANTS__ namespace __MSTL_CONSTANTS_NAMESPACE__ {
313
318
#define MSTL_END_CONSTANTS__ }
319
324
#define _CONSTANTS __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_CONSTANTS_NAMESPACE__ ::
325
326
331
#define __MSTL_THIS_THREAD_NAMESPACE__ this_thread
332
337
#define MSTL_BEGIN_THIS_THREAD__ namespace __MSTL_THIS_THREAD_NAMESPACE__ {
338
343
#define MSTL_END_THIS_THREAD__ }
344
349
#define _THIS_THREAD __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_THIS_THREAD_NAMESPACE__ ::
350
351
356
#define __MSTL_RANGES_NAMESPACE__ ranges
357
362
#define MSTL_BEGIN_RANGES__ namespace __MSTL_RANGES_NAMESPACE__ {
363
368
#define MSTL_END_RANGES__ }
369
374
#define _MSTL_RANGES __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_RANGES_NAMESPACE__ ::
375
380
#define __MSTL_RANGES_VIEWS_NAMESPACE__ views
381
386
#define MSTL_BEGIN_RANGES_VIEWS__ namespace __MSTL_RANGES_VIEWS_NAMESPACE__ {
387
392
#define MSTL_END_RANGES_VIEWS__ }
393
398
#define _RANGES_VIEWS __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_RANGES_NAMESPACE__ :: __MSTL_RANGES_VIEWS_NAMESPACE__ ::
399
400
405
#define __MSTL_LITERALS_NAMESPACE__ literals
406
411
#define MSTL_BEGIN_LITERALS__ inline namespace __MSTL_LITERALS_NAMESPACE__ {
412
417
#define MSTL_END_LITERALS__ }
418
423
#define _LITERALS __MSTL_GLOBAL_NAMESPACE__ :: __MSTL_LITERALS_NAMESPACE__ ::
424
// NamespaceMacros
426
432
433
#if (__cplusplus >= 202100L) || (_MSVC_LANG >= 202100L) || defined(MSTL_DOXYGEN_GENERATE)
438
#define MSTL_STANDARD_23__ 1
439
#endif
440
#if (__cplusplus >= 202002L) || defined(MSTL_STANDARD_23__) || (_MSVC_LANG >= 202002L) || defined(MSTL_DOXYGEN_GENERATE)
445
#define MSTL_STANDARD_20__ 1
446
#endif
447
#if (__cplusplus >= 201703L) || defined(MSTL_STANDARD_20__) || (_MSVC_LANG >= 201703L) || defined(MSTL_DOXYGEN_GENERATE)
452
#define MSTL_STANDARD_17__ 1
453
#endif
454
#if (__cplusplus >= 201402L) || defined(MSTL_STANDARD_17__) || (_MSVC_LANG >= 201402L) || defined(MSTL_DOXYGEN_GENERATE)
459
#define MSTL_STANDARD_14__ 1
460
#endif
461
#if (__cplusplus >= 201103L) || defined(MSTL_STANDARD_14__) || (_MSVC_LANG >= 201103L) || defined(MSTL_DOXYGEN_GENERATE)
466
#define MSTL_STANDARD_11__ 1
467
#endif
468
#if (__cplusplus >= 199711L) || defined(MSTL_STANDARD_11__) || (_MSVC_LANG >= 199711L) || defined(MSTL_DOXYGEN_GENERATE)
473
#define MSTL_STANDARD_98__ 1
474
#endif
475
// CxxStandardDetection
477
478
479
#ifdef MSTL_STANDARD_17__
480
#define MSTL_SUPPORT_DEDUCTION_GUIDES__ 1
481
#endif
482
483
484
#ifdef MSTL_STANDARD_11__
485
#define MSTL_CONSTEXPR11 constexpr
486
#else
487
#define MSTL_CONSTEXPR11 inline
488
#endif
// MSTL_STANDARD_11__
489
490
#ifdef MSTL_STANDARD_14__
491
#define MSTL_CONSTEXPR14 constexpr
492
#else
493
#define MSTL_CONSTEXPR14 inline
494
#endif
// MSTL_STANDARD_14__
495
496
#ifdef MSTL_STANDARD_17__
497
#define MSTL_CONSTEXPR17 constexpr
498
#define MSTL_INLINE17 inline
499
#else
500
#define MSTL_CONSTEXPR17 inline
501
#define MSTL_INLINE17
502
#endif
// MSTL_STANDARD_17__
503
504
#ifdef MSTL_STANDARD_20__
505
#define MSTL_CONSTEXPR20 constexpr
506
#else
507
#define MSTL_CONSTEXPR20 inline
508
#endif
// MSTL_STANDARD_20__
509
510
#ifdef MSTL_STANDARD_23__
511
#define MSTL_CONSTEXPR23 constexpr
512
#else
513
#define MSTL_CONSTEXPR23 inline
514
#endif
// MSTL_STANDARD_23__
515
516
517
#ifdef MSTL_STANDARD_17__
518
#define MSTL_IF_CONSTEXPR if constexpr
519
#else
520
#define MSTL_IF_CONSTEXPR if
521
#endif
522
523
524
#ifdef MSTL_STANDARD_17__
525
#define MSTL_NODISCARD [[nodiscard]]
526
527
#define MSTL_ALLOC_NODISCARD \
528
[[nodiscard("discard the return of allocators will cause memory leaks.")]]
529
#else
534
#define MSTL_NODISCARD
535
540
#define MSTL_ALLOC_NODISCARD
541
#endif
542
543
544
#ifdef MSTL_DOXYGEN_GENERATE
545
#define MSTL_ALWAYS_INLINE inline
546
#define MSTL_ALWAYS_INLINE_INLINE inline
547
#elif defined(MSTL_COMPILER_GNUC__)
548
#define MSTL_ALWAYS_INLINE __attribute__((always_inline))
549
#define MSTL_ALWAYS_INLINE_INLINE MSTL_ALWAYS_INLINE inline
550
#elif defined(MSTL_COMPILER_MSVC__)
551
#define MSTL_ALWAYS_INLINE __forceinline
552
#define MSTL_ALWAYS_INLINE_INLINE MSTL_ALWAYS_INLINE
553
#else
554
#define MSTL_ALWAYS_INLINE inline
555
#define MSTL_ALWAYS_INLINE_INLINE inline
556
#endif
557
558
559
#ifdef MSTL_COMPILER_GNUC__
560
#define MSTL_UNUSED __attribute__((unused))
561
#else
562
#define MSTL_UNUSED
563
#endif
564
565
566
#ifdef MSTL_STANDARD_17__
567
#define MSTL_UNLIKELY [[unlikely]]
568
#else
569
#define MSTL_UNLIKELY
570
#endif
571
572
573
#ifdef MSTL_STANDARD_20__
574
#define MSTL_LIKELY [[likely]]
575
#else
576
#define MSTL_LIKELY
577
#endif
578
579
580
#if defined(MSTL_STANDARD_11__)
581
#define MSTL_NORETURN [[noreturn]]
582
#elif defined(MSTL_COMPILER_GNUC__)
583
#define MSTL_NORETURN __attribute__((noreturn))
584
#elif defined(MSTL_COMPILER_MSVC__)
585
#define MSTL_NORETURN __declspec(noreturn)
586
#else
587
#define MSTL_NORETURN
588
#endif
589
590
591
#if !defined(MSTL_COMPILER_GNUC__) || defined(MSTL_DOXYGEN_GENERATE)
592
#define MSTL_PURE_FUNCTION
593
#define MSTL_MALLOC_FUNCTION
594
#define MSTL_CONST_FUNCTION
595
#define MSTL_NOTNULL_FUNCTION(PARAMS)
596
#else
597
#define MSTL_PURE_FUNCTION __attribute__((__pure__))
598
#define MSTL_MALLOC_FUNCTION __attribute__((__malloc__))
599
#define MSTL_CONST_FUNCTION __attribute__((__const__))
600
#define MSTL_NONNULL_FUNCTION(PARAMS) __attribute__((__nonnull__ PARAMS))
601
#endif
602
603
604
#ifdef MSTL_STANDARD_14__
605
#define MSTL_DEPRECATED [[deprecated]]
606
#define MSTL_DEPRECATE_FOR(MSG) [[deprecated(MSG)]]
607
608
#define MSTL_FUNC_ADAPTER_DEPRECATE \
609
MSTL_DEPRECATE_FOR("C++ 11 and later versions no longer use functor base types and functor adapters.")
610
611
#define MSTL_TRAITS_DEPRECATE \
612
MSTL_DEPRECATE_FOR("C++ 11 and later versions no longer use iterator traits functions.")
613
#else
614
#define MSTL_DEPRECATED
615
#define MSTL_DEPRECATE_FOR(MSG)
616
#define MSTL_FUNC_ADAPTER_DEPRECATE
617
#define MSTL_TRAITS_DEPRECATE
618
#endif
619
620
621
#if defined(MSTL_COMPILER_GNUC__)
622
#define MSTL_NOVTABLE __attribute__((novtable))
623
#elif defined(MSTL_COMPILER_MSVC__)
624
#define MSTL_NOVTABLE __declspec(novtable)
625
#else
626
#define MSTL_NOVTABLE
627
#endif
628
629
630
#if defined(MSTL_COMPILER_GNUC__)
631
#define MSTL_ALLOC_OPTIMIZE MSTL_ALWAYS_INLINE
632
#elif defined(MSTL_COMPILER_MSVC__)
633
#define MSTL_ALLOC_OPTIMIZE __declspec(allocator)
634
#else
635
#define MSTL_ALLOC_OPTIMIZE
636
#endif
637
638
639
#if defined(MSTL_COMPILER_GNUC__)
640
#define MSTL_RESTRICT __restrict__
641
#else
642
#define MSTL_RESTRICT __restrict
643
#endif
644
645
646
#ifdef MSTL_COMPILER_GNUC__
647
#define MSTL_UNREACHABLE __builtin_unreachable()
648
#elif defined(MSTL_COMPILER_MSVC__)
649
#define MSTL_UNREACHABLE __assume(false)
650
#else
651
#define MSTL_UNREACHABLE ((void)0)
652
#endif
653
654
655
#ifdef MSTL_STANDARD_20__
656
#define MSTL_NO_UNIQUE_ADDRESS [[no_unique_address]]
657
#else
658
#define MSTL_NO_UNIQUE_ADDRESS
659
#endif
660
661
662
#define MSTL_MACRO_RANGE_BASIC_CHARS(MAC) \
663
MAC(char) \
664
MAC(signed char) \
665
MAC(unsigned char) \
666
667
#if defined(MSTL_STANDARD_20__) || defined(MSTL_DOXYGEN_GENERATE)
668
669
#define MSTL_MACRO_RANGES_UNICODE_CHARS(MAC) \
670
MAC(char8_t) \
671
MAC(char16_t) \
672
MAC(char32_t)
673
#else
674
#define MSTL_MACRO_RANGES_UNICODE_CHARS(MAC) \
675
MAC(char16_t) \
676
MAC(char32_t)
677
#endif
678
679
#define MSTL_MACRO_RANGE_CHARS(MAC) \
680
MSTL_MACRO_RANGE_BASIC_CHARS(MAC) \
681
MAC(wchar_t) \
682
MSTL_MACRO_RANGES_UNICODE_CHARS(MAC)
683
684
#define MSTL_MACRO_RANGE_SINT(MAC) \
685
MAC(short) \
686
MAC(int) \
687
MAC(long) \
688
MAC(long long)
689
690
#define MSTL_MACRO_RANGE_USINT(MAC) \
691
MAC(unsigned short) \
692
MAC(unsigned int) \
693
MAC(unsigned long) \
694
MAC(unsigned long long)
695
696
#define MSTL_MACRO_RANGE_INT(MAC) \
697
MSTL_MACRO_RANGE_SINT(MAC) \
698
MSTL_MACRO_RANGE_USINT(MAC)
699
700
#define MSTL_MACRO_RANGE_FLOAT(MAC) \
701
MAC(float) \
702
MAC(double) \
703
MAC(long double)
704
705
#define MSTL_MACRO_RANGES_ALL(MAC) \
706
MSTL_MACRO_RANGE_CHARS(MAC) \
707
MSTL_MACRO_RANGE_INT(MAC) \
708
MSTL_MACRO_RANGE_FLOAT(MAC)
709
710
711
#define MSTL_MACRO_RANGES_CV(MAC) \
712
MAC(const) \
713
MAC(volatile) \
714
MAC(const volatile)
715
716
#define MSTL_MACRO_RANGES_CV_REF(MAC) \
717
MAC(&) \
718
MAC(const &) \
719
MAC(volatile &) \
720
MAC(const volatile &) \
721
MAC(&&) \
722
MAC(const &&) \
723
MAC(volatile &&) \
724
MAC(const volatile &&)
725
726
#define MSTL_MACRO_RANGES_CV_REF_NOEXCEPT(MAC) \
727
MAC(noexcept) \
728
MAC(const noexcept) \
729
MAC(volatile noexcept) \
730
MAC(const volatile noexcept) \
731
MAC(& noexcept) \
732
MAC(const & noexcept) \
733
MAC(volatile & noexcept) \
734
MAC(const volatile & noexcept) \
735
MAC(&& noexcept) \
736
MAC(const && noexcept) \
737
MAC(volatile && noexcept) \
738
MAC(const volatile && noexcept) \
739
740
741
#define MSTL_IGNORE (void)
742
743
744
#ifdef MSTL_STATE_DEBUG__
745
#define MSTL_DEBUG_VERIFY(CON, MESG) \
746
{ if (CON) {} else { assert(false && MESG); } }
747
#else
748
#define MSTL_DEBUG_VERIFY(CON, MESG)
749
#endif
750
751
#define __MSTL_DEBUG_MESG_OPERATE_NULLPTR(ITER, ACT) "can`t " ACT ": " #ITER " is pointing to nullptr."
752
#define __MSTL_DEBUG_MESG_OUT_OF_RANGE(CLASS, ACT) "can`t " ACT ": " #CLASS " out of ranges."
753
#define __MSTL_DEBUG_MESG_CONTAINER_INCOMPATIBLE(ITER) "not comparable :" #ITER " container incompatible."
754
755
#define __MSTL_DEBUG_TAG_DEREFERENCE "dereference"
756
#define __MSTL_DEBUG_TAG_INCREMENT "increment"
757
#define __MSTL_DEBUG_TAG_DECREMENT "decrement"
758
759
760
#if defined(MSTL_STANDARD_20__)
761
#define MSTL_CONSTEXPR_ASSERT(COND) \
762
do { \
763
if (__builtin_is_constant_evaluated() && !bool(COND)) \
764
MSTL_UNREACHABLE; \
765
} while (false);
766
#elif defined(MSTL_STATE_DEBUG__)
767
#define MSTL_CONSTEXPR_ASSERT(COND) \
768
do { \
769
if (!bool(COND)) \
770
assert(false); \
771
} while (false);
772
#else
773
#define MSTL_CONSTEXPR_ASSERT(COND)
774
#endif
775
776
#endif
// MSTL_CORE_CONFIG_CPPCONFIG_HPP__
include
MSTL
core
config
c++config.hpp
制作者
1.16.0