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