Embedded Template Library 1.0
Loading...
Searching...
No Matches
platform.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2016 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_PLATFORM_INCLUDED
32#define ETL_PLATFORM_INCLUDED
33
34//*************************************
35// Enable all limit macros
36// Note: This macro must be defined before the first include of stdint.h
37#if !defined(__STDC_LIMIT_MACROS)
38 #define __STDC_LIMIT_MACROS
39#endif
40
41//*************************************
42// Enable all constant macros
43// Note: This macro must be defined before the first include of stdint.h
44#if !defined(__STDC_CONSTANT_MACROS)
45 #define __STDC_CONSTANT_MACROS
46#endif
47
48#include <stddef.h>
49#include <stdint.h>
50#include <limits.h>
51
52#include "file_error_numbers.h"
53
54//*************************************
55// Include the user's profile definition.
56#if !defined(ETL_NO_PROFILE_HEADER) && defined(__has_include)
57 #if !__has_include("etl_profile.h")
58 #define ETL_NO_PROFILE_HEADER
59 #endif
60#endif
61
62#if !defined(ETL_NO_PROFILE_HEADER)
63 #include "etl_profile.h"
64#endif
65
66// Null statement
67#define ETL_DO_NOTHING static_cast<void>(0)
68
69// Determine the bit width of the platform.
70#define ETL_PLATFORM_16BIT (UINT16_MAX == UINTPTR_MAX)
71#define ETL_PLATFORM_32BIT (UINT32_MAX == UINTPTR_MAX)
72#define ETL_PLATFORM_64BIT (UINT64_MAX == UINTPTR_MAX)
73
74//*************************************
75// Define debug macros.
76#if (defined(_DEBUG) || defined(DEBUG)) && !defined(ETL_DEBUG)
77 #define ETL_DEBUG
78#endif
79
80#if defined(ETL_DEBUG)
81 #define ETL_IS_DEBUG_BUILD 1
82#else
83 #define ETL_IS_DEBUG_BUILD 0
84#endif
85
86//*************************************
87// Helper macros, so we don't have to use double negatives.
88// The ETL will use the STL, unless ETL_NO_STL is defined.
89// With this macro we can use '#if ETL_USING_STL' instead of '#if !ETL_NO_STL' in the code.
90#if defined(ETL_NO_STL)
91 #define ETL_USING_STL 0
92 #define ETL_NOT_USING_STL 1
93#else
94 #define ETL_USING_STL 1
95 #define ETL_NOT_USING_STL 0
96#endif
97
98//*************************************
99// Helper macros for ETL_STLPORT.
100#if defined(ETL_STLPORT)
101 #define ETL_USING_STLPORT 1
102 #define ETL_NOT_USING_STLPORT 0
103#else
104 #define ETL_USING_STLPORT 0
105 #define ETL_NOT_USING_STLPORT 1
106#endif
107
108//*************************************
109// Some targets do not support 8bit types.
110#if (CHAR_BIT == 8)
111 #define ETL_USING_8BIT_TYPES 1
112 #define ETL_NOT_USING_8BIT_TYPES 0
113#else
114 #define ETL_USING_8BIT_TYPES 0
115 #define ETL_NOT_USING_8BIT_TYPES 1
116#endif
117
118#define ETL_8BIT_SUPPORT (CHAR_BIT == 8) // Deprecated
119
120//*************************************
121// Some targets support 20bit types.
122#if defined(ETL_USE_20BIT_TYPES)
123 #define ETL_USING_20BIT_TYPES 1
124 #define ETL_NOT_USING_20BIT_TYPES 0
125#else
126 #define ETL_USING_20BIT_TYPES 0
127 #define ETL_NOT_USING_20BIT_TYPES 1
128#endif
129
130
131//*************************************
132// Helper macro for ETL_NO_64BIT_TYPES.
133#if defined(ETL_NO_64BIT_TYPES)
134 #define ETL_USING_64BIT_TYPES 0
135 #define ETL_NOT_USING_64BIT_TYPES 1
136#else
137 #define ETL_USING_64BIT_TYPES 1
138 #define ETL_NOT_USING_64BIT_TYPES 0
139#endif
140
141//*************************************
142// Figure out things about the compiler, if haven't already done so in etl_profile.h
145
146//*************************************
147// See if we can determine the OS we're compiling on, if haven't already done so in etl_profile.h
149
150//*************************************
151// Helper macro for choosing the variant type.
152#if !ETL_USING_CPP11 || defined(ETL_USE_LEGACY_VARIANT)
153 #define ETL_USING_LEGACY_VARIANT 1
154 #define ETL_NOT_USING_LEGACY_VARIANT 0
155#else
156 #define ETL_USING_LEGACY_VARIANT 0
157 #define ETL_NOT_USING_LEGACY_VARIANT 1
158#endif
159
160//*************************************
161// Check WCHAR_MIN and WCHAR_MAX
162#if !defined(WCHAR_MIN)
163 #define WCHAR_MIN 0x0000
164#endif
165
166#if !defined(WCHAR_MAX)
167 #define WCHAR_MAX 0xFFFF
168#endif
169
170//*************************************
171// Option to force string construction from a character pointer to be explicit.
172#if defined(ETL_FORCE_EXPLICIT_STRING_CONVERSION_FROM_CHAR)
173 #define ETL_EXPLICIT_STRING_FROM_CHAR explicit
174#else
175 #define ETL_EXPLICIT_STRING_FROM_CHAR
176#endif
177
178//*************************************
179// Option to disable truncation checks for strings.
180#if defined(ETL_DISABLE_STRING_TRUNCATION_CHECKS)
181 #define ETL_HAS_STRING_TRUNCATION_CHECKS 0
182#else
183 #define ETL_HAS_STRING_TRUNCATION_CHECKS 1
184#endif
185
186//*************************************
187// Option to disable clear-after-use functionality for strings.
188#if defined(ETL_DISABLE_STRING_CLEAR_AFTER_USE)
189 #define ETL_HAS_STRING_CLEAR_AFTER_USE 0
190#else
191 #define ETL_HAS_STRING_CLEAR_AFTER_USE 1
192#endif
193
194//*************************************
195// Option to make string truncation an error.
196#if defined(ETL_ENABLE_ERROR_ON_STRING_TRUNCATION)
197 #define ETL_HAS_ERROR_ON_STRING_TRUNCATION 1
198#else
199 #define ETL_HAS_ERROR_ON_STRING_TRUNCATION 0
200#endif
201
202//*************************************
203// Option to enable repair-after-memcpy for istrings.
204#if defined(ETL_ISTRING_REPAIR_ENABLE)
205 #define ETL_HAS_ISTRING_REPAIR 1
206#else
207 #define ETL_HAS_ISTRING_REPAIR 0
208#endif
209
210//*************************************
211// Option to enable repair-after-memcpy for ivector.
212#if defined(ETL_IVECTOR_REPAIR_ENABLE)
213 #define ETL_HAS_IVECTOR_REPAIR 1
214#else
215 #define ETL_HAS_IVECTOR_REPAIR 0
216#endif
217
218//*************************************
219// Option to enable repair-after-memcpy for ideque.
220#if defined(ETL_IDEQUE_REPAIR_ENABLE)
221 #define ETL_HAS_IDEQUE_REPAIR 1
222#else
223 #define ETL_HAS_IDEQUE_REPAIR 0
224#endif
225
226//*************************************
227// Option to enable repair-after-memcpy for icircular_buffer.
228#if defined(ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE)
229#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 1
230#else
231#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 0
232#endif
233
234//*************************************
235// Indicate if C++ exceptions are enabled.
236#if defined(ETL_THROW_EXCEPTIONS)
237 #define ETL_USING_EXCEPTIONS 1
238#else
239 #define ETL_USING_EXCEPTIONS 0
240#endif
241
242//*************************************
243// Indicate if nullptr is used.
244#if ETL_NO_NULLPTR_SUPPORT
245 #define ETL_HAS_NULLPTR 0
246#else
247 #define ETL_HAS_NULLPTR 1
248#endif
249
250//*************************************
251// Indicate if legacy bitset is used.
252#if defined(ETL_USE_LEGACY_BITSET)
253 #define ETL_USING_LEGACY_BITSET 1
254#else
255 #define ETL_USING_LEGACY_BITSET 0
256#endif
257
258//*************************************
259// Indicate if array_view is mutable.
260#if defined(ETL_ARRAY_VIEW_IS_MUTABLE)
261 #define ETL_HAS_MUTABLE_ARRAY_VIEW 1
262#else
263 #define ETL_HAS_MUTABLE_ARRAY_VIEW 0
264#endif
265
266//*************************************
267// Indicate if etl::imassage is to be non-virtual.
268#if defined(ETL_MESSAGES_ARE_NOT_VIRTUAL)
269 #define ETL_HAS_VIRTUAL_MESSAGES 0
270#else
271 #define ETL_HAS_VIRTUAL_MESSAGES 1
272#endif
273
274//*************************************
275// The macros below are dependent on the profile.
276// C++11
277#if ETL_USING_CPP11
278 #define ETL_CONSTEXPR constexpr
279 #define ETL_CONSTEXPR11 constexpr // Synonym for ETL_CONSTEXPR
280 #define ETL_CONSTANT constexpr
281 #define ETL_DELETE = delete
282 #define ETL_EXPLICIT explicit
283 #define ETL_OVERRIDE override
284 #define ETL_FINAL final
285 #define ETL_NORETURN [[noreturn]]
286 #define ETL_MOVE(x) etl::move(x)
287 #define ETL_ENUM_CLASS(name) enum class name
288 #define ETL_ENUM_CLASS_TYPE(name, type) enum class name : type
289 #define ETL_LVALUE_REF_QUALIFIER &
290
291 #if ETL_USING_EXCEPTIONS
292 #define ETL_NOEXCEPT noexcept
293 #define ETL_NOEXCEPT_EXPR(...) noexcept(__VA_ARGS__)
294 #else
295 #define ETL_NOEXCEPT
296 #define ETL_NOEXCEPT_EXPR(...)
297 #endif
298#else
299 #define ETL_CONSTEXPR
300 #define ETL_CONSTEXPR11
301 #define ETL_CONSTANT const
302 #define ETL_DELETE
303 #define ETL_EXPLICIT
304 #define ETL_OVERRIDE
305 #define ETL_FINAL
306 #define ETL_NORETURN
307 #define ETL_NOEXCEPT
308 #define ETL_NOEXCEPT_EXPR(...)
309 #define ETL_MOVE(x) x
310 #define ETL_ENUM_CLASS(name) enum name
311 #define ETL_ENUM_CLASS_TYPE(name, type) enum name
312 #define ETL_LVALUE_REF_QUALIFIER
313#endif
314
315//*************************************
316// C++14
317#if ETL_USING_CPP14
318 #define ETL_CONSTEXPR14 constexpr
319
320 #if !defined(ETL_IN_UNIT_TEST)
321 #define ETL_DEPRECATED [[deprecated]]
322 #define ETL_DEPRECATED_REASON(reason) [[deprecated(reason)]]
323 #else
324 #define ETL_DEPRECATED
325 #define ETL_DEPRECATED_REASON(reason)
326 #endif
327#else
328 #define ETL_CONSTEXPR14
329 #define ETL_DEPRECATED
330 #define ETL_DEPRECATED_REASON(reason)
331#endif
332
333//*************************************
334// C++17
335#if ETL_USING_CPP17
336 #define ETL_CONSTEXPR17 constexpr
337 #define ETL_IF_CONSTEXPR constexpr
338 #define ETL_NODISCARD [[nodiscard]]
339 #define ETL_MAYBE_UNUSED [[maybe_unused]]
340 #define ETL_FALLTHROUGH [[fallthrough]]
341 #define ETL_INLINE_VAR inline
342#else
343 #define ETL_CONSTEXPR17
344 #define ETL_IF_CONSTEXPR
345 #define ETL_NODISCARD
346 #define ETL_MAYBE_UNUSED
347 #define ETL_FALLTHROUGH
348 #define ETL_INLINE_VAR
349#endif
350
351//*************************************
352// C++20
353#if ETL_USING_CPP20
354 #define ETL_LIKELY [[likely]]
355 #define ETL_UNLIKELY [[unlikely]]
356 #define ETL_CONSTEXPR20 constexpr
357 #define ETL_CONSTEVAL consteval
358 #define ETL_CONSTINIT constinit
359 #define ETL_NO_UNIQUE_ADDRESS [[no_unique_address]]
360 #define ETL_EXPLICIT_EXPR(...) explicit(__VA_ARGS__)
361#else
362 #define ETL_LIKELY
363 #define ETL_UNLIKELY
364 #define ETL_CONSTEXPR20
365 #define ETL_CONSTEVAL
366 #define ETL_CONSTINIT
367 #define ETL_NO_UNIQUE_ADDRESS
368 #define ETL_EXPLICIT_EXPR(...) explicit
369#endif
370
371#if ETL_USING_CPP20 && ETL_USING_STL
372 #define ETL_CONSTEXPR20_STL constexpr
373#else
374 #define ETL_CONSTEXPR20_STL
375#endif
376
377//*************************************
378// C++23
379#if ETL_USING_CPP23
380 #define ETL_ASSUME(expression) [[assume(expression)]]
381#else
382 #define ETL_ASSUME ETL_DO_NOTHING
383#endif
384
385//*************************************
386// Determine if the ETL can use char8_t type.
387#if ETL_NO_SMALL_CHAR_SUPPORT
389 typedef uint_least8_t char8_t;
390 #define ETL_HAS_CHAR8_T 1
391 #define ETL_HAS_NATIVE_CHAR8_T 0
393#else
394 #define ETL_HAS_CHAR8_T 1
395 #define ETL_HAS_NATIVE_CHAR8_T 1
396#endif
397
398//*************************************
399// Define the large character types if necessary.
400#if ETL_NO_LARGE_CHAR_SUPPORT
401 typedef uint_least16_t char16_t;
402 typedef uint_least32_t char32_t;
403 #define ETL_HAS_NATIVE_CHAR16_T 0
404 #define ETL_HAS_NATIVE_CHAR32_T 0
405#else
406 #define ETL_HAS_NATIVE_CHAR16_T 1
407 #define ETL_HAS_NATIVE_CHAR32_T 1
408#endif
409
410//*************************************
411// Determine if the ETL can use std::array
412#if !defined(ETL_HAS_STD_ARRAY)
413 #if ETL_USING_STL && ETL_USING_CPP11
414 #define ETL_HAS_STD_ARRAY 1
415 #else
416 #define ETL_HAS_STD_ARRAY 0
417 #endif
418#endif
419
420//*************************************
421// Determine if the ETL should support atomics.
422#if defined(ETL_NO_ATOMICS) || \
423 defined(ETL_TARGET_DEVICE_ARM_CORTEX_M0) || \
424 defined(ETL_TARGET_DEVICE_ARM_CORTEX_M0_PLUS) || \
425 defined(__STDC_NO_ATOMICS__)
426 #define ETL_HAS_ATOMIC 0
427#else
428 #if ((ETL_USING_CPP11 && (ETL_USING_STL || defined(ETL_IN_UNIT_TEST))) || \
429 defined(ETL_COMPILER_ARM5) || \
430 defined(ETL_COMPILER_ARM6) || \
431 defined(ETL_COMPILER_GCC) || \
432 defined(ETL_COMPILER_CLANG))
433 #define ETL_HAS_ATOMIC 1
434 #else
435 #define ETL_HAS_ATOMIC 0
436 #endif
437#endif
438
439//*************************************
440// Determine if the ETL should use std::initializer_list.
441#if (defined(ETL_FORCE_ETL_INITIALIZER_LIST) && defined(ETL_FORCE_STD_INITIALIZER_LIST))
442 #error ETL_FORCE_ETL_INITIALIZER_LIST and ETL_FORCE_STD_INITIALIZER_LIST both been defined. Choose one or neither.
443#endif
444
445#if (ETL_USING_CPP11 && !defined(ETL_NO_INITIALIZER_LIST))
446 // Use the compiler's std::initializer_list?
447 #if (ETL_USING_STL && ETL_NOT_USING_STLPORT && !defined(ETL_FORCE_ETL_INITIALIZER_LIST)) || defined(ETL_IN_UNIT_TEST) || defined(ETL_FORCE_STD_INITIALIZER_LIST)
448 #define ETL_HAS_INITIALIZER_LIST 1
449 #else
450 // Use the ETL's compatible version?
451 #if defined(ETL_COMPILER_MICROSOFT) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_CLANG) || \
452 defined(ETL_COMPILER_ARM6) || defined(ETL_COMPILER_ARM7) || defined(ETL_COMPILER_IAR) || \
453 defined(ETL_COMPILER_TEXAS_INSTRUMENTS) || defined(ETL_COMPILER_INTEL)
454 #define ETL_HAS_INITIALIZER_LIST 1
455 #else
456 #define ETL_HAS_INITIALIZER_LIST 0
457 #endif
458 #endif
459#else
460 #define ETL_HAS_INITIALIZER_LIST 0
461#endif
462
463//*************************************
464// Determine if the ETL should use __attribute__((packed).
465#if defined(ETL_COMPILER_CLANG) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_INTEL) || defined(ETL_COMPILER_ARM6)
466 #define ETL_PACKED_CLASS(class_type) class __attribute__((packed)) class_type
467 #define ETL_PACKED_STRUCT(struct_type) struct __attribute__((packed)) struct_type
468 #define ETL_END_PACKED
469 #define ETL_HAS_PACKED 1
470#elif defined(ETL_COMPILER_MICROSOFT)
471 #define ETL_PACKED_CLASS(class_type) __pragma(pack(push, 1)) class class_type
472 #define ETL_PACKED_STRUCT(struct_type) __pragma(pack(push, 1)) struct struct_type
473 #define ETL_PACKED
474 #define ETL_END_PACKED __pragma(pack(pop))
475 #define ETL_HAS_PACKED 1
476#else
477 #define ETL_PACKED_CLASS(class_type) class class_type
478 #define ETL_PACKED_STRUCT(struct_type) struct struct_type
479 #define ETL_END_PACKED
480 #define ETL_HAS_PACKED 0
481#endif
482
483//*************************************
484// Check for availability of certain builtins
486
487//*************************************
488// Sort out namespaces for STL/No STL options.
490
491namespace etl
492{
493 namespace traits
494 {
495 // Documentation: https://www.etlcpp.com/etl_traits.html
496 // General
497 static ETL_CONSTANT long cplusplus = __cplusplus;
498 static ETL_CONSTANT int language_standard = ETL_LANGUAGE_STANDARD;
499
500 // Using...
501 static ETL_CONSTANT bool using_stl = (ETL_USING_STL == 1);
502 static ETL_CONSTANT bool using_stlport = (ETL_USING_STLPORT == 1);
503 static ETL_CONSTANT bool using_cpp11 = (ETL_USING_CPP11 == 1);
504 static ETL_CONSTANT bool using_cpp14 = (ETL_USING_CPP14 == 1);
505 static ETL_CONSTANT bool using_cpp17 = (ETL_USING_CPP17 == 1);
506 static ETL_CONSTANT bool using_cpp20 = (ETL_USING_CPP20 == 1);
507 static ETL_CONSTANT bool using_cpp23 = (ETL_USING_CPP23 == 1);
508 static ETL_CONSTANT bool using_gcc_compiler = (ETL_USING_GCC_COMPILER == 1);
509 static ETL_CONSTANT bool using_microsoft_compiler = (ETL_USING_MICROSOFT_COMPILER == 1);
510 static ETL_CONSTANT bool using_arm5_compiler = (ETL_USING_ARM5_COMPILER == 1);
511 static ETL_CONSTANT bool using_arm6_compiler = (ETL_USING_ARM6_COMPILER == 1);
512 static ETL_CONSTANT bool using_arm7_compiler = (ETL_USING_ARM7_COMPILER == 1);
513 static ETL_CONSTANT bool using_clang_compiler = (ETL_USING_CLANG_COMPILER == 1);
514 static ETL_CONSTANT bool using_green_hills_compiler = (ETL_USING_GREEN_HILLS_COMPILER == 1);
515 static ETL_CONSTANT bool using_iar_compiler = (ETL_USING_IAR_COMPILER == 1);
516 static ETL_CONSTANT bool using_intel_compiler = (ETL_USING_INTEL_COMPILER == 1);
517 static ETL_CONSTANT bool using_texas_instruments_compiler = (ETL_USING_TEXAS_INSTRUMENTS_COMPILER == 1);
518 static ETL_CONSTANT bool using_generic_compiler = (ETL_USING_GENERIC_COMPILER == 1);
519 static ETL_CONSTANT bool using_legacy_bitset = (ETL_USING_LEGACY_BITSET == 1);
520 static ETL_CONSTANT bool using_exceptions = (ETL_USING_EXCEPTIONS == 1);
521
522 // Has...
523 static ETL_CONSTANT bool has_initializer_list = (ETL_HAS_INITIALIZER_LIST == 1);
524 static ETL_CONSTANT bool has_8bit_types = (ETL_USING_8BIT_TYPES == 1);
525 static ETL_CONSTANT bool has_64bit_types = (ETL_USING_64BIT_TYPES == 1);
526 static ETL_CONSTANT bool has_atomic = (ETL_HAS_ATOMIC == 1);
527 static ETL_CONSTANT bool has_nullptr = (ETL_HAS_NULLPTR == 1);
528 static ETL_CONSTANT bool has_char8_t = (ETL_HAS_CHAR8_T == 1);
529 static ETL_CONSTANT bool has_native_char8_t = (ETL_HAS_NATIVE_CHAR8_T == 1);
530 static ETL_CONSTANT bool has_native_char16_t = (ETL_HAS_NATIVE_CHAR16_T == 1);
531 static ETL_CONSTANT bool has_native_char32_t = (ETL_HAS_NATIVE_CHAR32_T == 1);
532 static ETL_CONSTANT bool has_string_truncation_checks = (ETL_HAS_STRING_TRUNCATION_CHECKS == 1);
533 static ETL_CONSTANT bool has_error_on_string_truncation = (ETL_HAS_ERROR_ON_STRING_TRUNCATION == 1);
534 static ETL_CONSTANT bool has_string_clear_after_use = (ETL_HAS_STRING_CLEAR_AFTER_USE == 1);
535 static ETL_CONSTANT bool has_istring_repair = (ETL_HAS_ISTRING_REPAIR == 1);
536 static ETL_CONSTANT bool has_ivector_repair = (ETL_HAS_IVECTOR_REPAIR == 1);
537 static ETL_CONSTANT bool has_icircular_buffer_repair = (ETL_HAS_ICIRCULAR_BUFFER_REPAIR == 1);
538 static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1);
539 static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1);
540 static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1);
541 static ETL_CONSTANT bool has_packed = (ETL_HAS_PACKED == 1);
542
543 // Is...
544 static ETL_CONSTANT bool is_debug_build = (ETL_IS_DEBUG_BUILD == 1);
545 }
546}
547
548#endif
bitset_ext
Definition absolute.h:38