COMMS
Template library intended to help with implementation of communication protocols.
CompileControl.h
Go to the documentation of this file.
1 //
2 // Copyright 2015 - 2024 (C). Alex Robenko. All rights reserved.
3 //
4 // This Source Code Form is subject to the terms of the Mozilla Public
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 
10 
11 #pragma once
12 
13 #ifdef __GNUC__
14 
15 #define GCC_DIAG_STR(s) #s
16 #define GCC_DIAG_JOINSTR(x,y) GCC_DIAG_STR(x ## y)
17 #define GCC_DIAG_DO_PRAGMA(x) _Pragma (#x)
18 #define GCC_DIAG_PRAGMA(x) GCC_DIAG_DO_PRAGMA(GCC diagnostic x)
19 #define CC_DISABLE_WARNINGS() \
20  GCC_DIAG_PRAGMA(push) \
21  GCC_DIAG_PRAGMA(ignored "-Wpedantic") \
22  GCC_DIAG_PRAGMA(ignored "-Wctor-dtor-privacy")\
23  GCC_DIAG_PRAGMA(ignored "-Wold-style-cast") \
24  GCC_DIAG_PRAGMA(ignored "-Wconversion")
25 
26 #define CC_ENABLE_WARNINGS() GCC_DIAG_PRAGMA(pop)
27 
28 #define COMMS_GNU_WARNING_PUSH GCC_DIAG_PRAGMA(push)
29 #define COMMS_GNU_WARNING_DISABLE(x_) GCC_DIAG_PRAGMA(ignored x_)
30 #define COMMS_GNU_WARNING_POP GCC_DIAG_PRAGMA(pop)
31 
32 #else
33 
34 #define CC_DISABLE_WARNINGS()
35 #define CC_ENABLE_WARNINGS()
36 #define COMMS_GNU_WARNING_PUSH
37 #define COMMS_GNU_WARNING_DISABLE(x_)
38 #define COMMS_GNU_WARNING_POP
39 
40 #endif
41 
42 
43 #define COMMS_IS_MSVC false
44 #define COMMS_IS_GCC false
45 #define COMMS_IS_CLANG false
46 #define COMMS_IS_USING_GNUC false
47 
48 #if defined(__GNUC__)
49 #undef COMMS_IS_USING_GNUC
50 #define COMMS_IS_USING_GNUC true
51 #endif // #if defined(__GNUC__) && !defined(__clang__)
52 
53 #if defined(_MSC_VER) && !defined(__clang__)
54 #undef COMMS_IS_MSVC
55 #define COMMS_IS_MSVC true
56 #endif // #if defined(_MSC_VER) && !defined(__clang__)
57 
58 #if defined(__GNUC__) && !defined(__clang__)
59 #undef COMMS_IS_GCC
60 #define COMMS_IS_GCC true
61 #endif // #if defined(__GNUC__) && !defined(__clang__)
62 
63 #if defined(__clang__)
64 
65 #undef COMMS_IS_CLANG
66 #define COMMS_IS_CLANG true
67 #endif // #if defined(__clang__)
68 
69 #define COMMS_IS_GCC_47_OR_BELOW (COMMS_IS_GCC && (__GNUC__ == 4) && (__GNUC_MINOR__ < 8))
70 #define COMMS_IS_GCC_9 (COMMS_IS_GCC && (__GNUC__ == 9))
71 #define COMMS_IS_GCC_9_OR_BELOW (COMMS_IS_GCC_9 && (__GNUC__ <= 9))
72 #define COMMS_IS_GCC_9_OR_ABOVE (COMMS_IS_GCC_9 && (__GNUC__ >= 9))
73 #define COMMS_IS_GCC_10 (COMMS_IS_GCC && (__GNUC__ == 10))
74 #define COMMS_IS_GCC_10_OR_ABOVE (COMMS_IS_GCC && (__GNUC__ >= 10))
75 #define COMMS_IS_GCC_10_OR_BELOW (COMMS_IS_GCC && (__GNUC__ <= 10))
76 #define COMMS_IS_GCC_11 (COMMS_IS_GCC && (__GNUC__ == 11))
77 #define COMMS_IS_GCC_11_OR_ABOVE (COMMS_IS_GCC && (__GNUC__ >= 11))
78 #define COMMS_IS_GCC_12 (COMMS_IS_GCC && (__GNUC__ == 12))
79 #define COMMS_IS_CLANG_7_OR_ABOVE (COMMS_IS_CLANG && (__clang_major__ >= 7))
80 #define COMMS_IS_CLANG_8 (COMMS_IS_CLANG && (__clang_major__ == 8))
81 #define COMMS_IS_CLANG_8_OR_BELOW (COMMS_IS_CLANG && (__clang_major__ <= 8))
82 #define COMMS_IS_CLANG_9_OR_BELOW (COMMS_IS_CLANG && (__clang_major__ <= 9))
83 #define COMMS_IS_CLANG_9_OR_ABOVE (COMMS_IS_CLANG && (__clang_major__ >= 9))
84 #define COMMS_IS_MSVC_2019 (COMMS_IS_MSVC && (_MSC_VER >= 1920) && (_MSC_VER < 1930))
85 #define COMMS_IS_MSVC_2019_OR_BELOW (COMMS_IS_MSVC && (_MSC_VER < 1930))
86 #define COMMS_IS_MSVC_2017_OR_BELOW (COMMS_IS_MSVC && (_MSC_VER < 1920))
87 #define COMMS_IS_MSVC_2015_OR_BELOW (COMMS_IS_MSVC && (_MSC_VER < 1910))
88 
89 #if !defined(COMMS_COMPILER_GCC47) && COMMS_IS_GCC_47_OR_BELOW
90 #define COMMS_COMPILER_GCC47
91 #endif
92 
93 #define COMMS_IS_CPP14 (__cplusplus >= 201402L)
94 #define COMMS_IS_CPP17 (__cplusplus >= 201703L)
95 #define COMMS_IS_CPP20 (__cplusplus >= 202002L)
96 
97 #if COMMS_IS_MSVC_2019_OR_BELOW // Visual Studio 2019
98 #undef COMMS_IS_CPP20
99 #define COMMS_IS_CPP20 (__cplusplus >= 201704L)
100 #endif
101 
102 #if COMMS_IS_GCC_10_OR_BELOW
103 #undef COMMS_IS_CPP20
104 #define COMMS_IS_CPP20 (__cplusplus >= 201709L)
105 #endif
106 
107 #if COMMS_IS_CLANG_9_OR_BELOW
108 #undef COMMS_IS_CPP20
109 #define COMMS_IS_CPP20 (__cplusplus >= 201709L)
110 #endif
111 
112 #if COMMS_IS_CLANG_8_OR_BELOW
113 #undef COMMS_IS_CPP20
114 #define COMMS_IS_CPP20 (__cplusplus >= 201707L)
115 #endif
116 
117 #define COMMS_CLANG_HAS_STRING_VIEW false
118 #define COMMS_CLANG_HAS_VERSION_HEADER false
119 
120 #if COMMS_IS_CLANG
121 
122 // The defines below are seperate because VS2015 doesn't
123 // behave well with angle brackets inside macro arguments.
124 
125 #undef COMMS_CLANG_HAS_STRING_VIEW
126 #define COMMS_CLANG_HAS_STRING_VIEW (__has_include(<string_view>))
127 
128 #undef COMMS_CLANG_HAS_VERSION_HEADER
129 #define COMMS_CLANG_HAS_VERSION_HEADER (__has_include(<version>))
130 
131 #endif // #if COMMS_IS_CLANG
132 
133 
134 #define COMMS_HAS_CPP20_VERSION_HEADER \
135  COMMS_IS_CPP20 && \
136  (\
137  (COMMS_IS_USING_GNUC && (__GNUC__ >= 9)) || \
138  (COMMS_IS_CLANG && COMMS_CLANG_HAS_VERSION_HEADER) || \
139  (COMMS_IS_MSVC && (_MSC_VER >= 1922)) \
140  )
141 
142 #if COMMS_HAS_CPP20_VERSION_HEADER
143 #include <version>
144 #endif
145 
146 #define COMMS_HAS_CPP17_STRING_VIEW false
147 
148 #ifndef COMMS_NO_CPP17_STRING_VIEW
149 #undef COMMS_HAS_CPP17_STRING_VIEW
150 #define COMMS_HAS_CPP17_STRING_VIEW \
151  COMMS_IS_CPP17 && \
152  (\
153  (COMMS_IS_USING_GNUC && (__GNUC__ >= 7)) || \
154  (COMMS_IS_CLANG && COMMS_CLANG_HAS_STRING_VIEW) || \
155  (COMMS_IS_MSVC && (_MSC_VER >= 1910)) \
156  )
157 
158 #endif // #ifndef COMMS_NO_CPP17_STRING_VIEW
159 
160 #define COMMS_HAS_CPP20_SPAN false
161 #if !defined(COMMS_NO_CPP20_SPAN) && COMMS_IS_CPP20 && defined(__cpp_lib_span)
162 #undef COMMS_HAS_CPP20_SPAN
163 #define COMMS_HAS_CPP20_SPAN true
164 #endif // #if COMMS_IS_CPP20 && defined(__cpp_lib_span)
165 
166 #if COMMS_IS_MSVC
167 
168 #define COMMS_MSVC_WARNING_PRAGMA(s_) __pragma(s_)
169 #define COMMS_MSVC_WARNING_PUSH __pragma(warning(push))
170 #define COMMS_MSVC_WARNING_POP __pragma(warning(pop))
171 #define COMMS_MSVC_WARNING_DISABLE(w_) __pragma(warning(disable:w_))
172 #define COMMS_MSVC_WARNING_SUPPRESS(w_) __pragma(warning(suppress:w_))
173 
174 #else // #if COMMS_IS_MSVC
175 
176 #define COMMS_MSVC_WARNING_PRAGMA(s_)
177 #define COMMS_MSVC_WARNING_PUSH
178 #define COMMS_MSVC_WARNING_POP
179 #define COMMS_MSVC_WARNING_DISABLE(w_)
180 #define COMMS_MSVC_WARNING_SUPPRESS(w_)
181 
182 #endif // #if COMMS_IS_MSVC
183 
184 
185 
186