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) \
762do { \
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) \
768do { \
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__