Horizon
config.hpp
1 // Range v3 library
2 //
3 // Copyright Eric Niebler 2013-present
4 // Copyright Casey Carter 2016
5 //
6 // Use, modification and distribution is subject to the
7 // Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 //
11 // Project home: https://github.com/ericniebler/range-v3
12 //
13 
14 #ifndef RANGES_V3_DETAIL_CONFIG_HPP
15 #define RANGES_V3_DETAIL_CONFIG_HPP
16 
17 // Grab some version information.
18 #ifndef __has_include
19 #include <iosfwd>
20 #elif __has_include(<version>)
21 #include <version>
22 #else
23 #include <iosfwd>
24 #endif
25 
26 #if(defined(NDEBUG) && !defined(RANGES_ENSURE_MSG)) || \
27  (!defined(NDEBUG) && !defined(RANGES_ASSERT) && \
28  ((defined(__GNUC__) && !defined(__clang__) && \
29  (__GNUC__ < 5 || defined(__MINGW32__))) || \
30  defined(_MSVC_STL_VERSION)))
31 #include <cstdio>
32 #include <cstdlib>
33 
34 namespace ranges
35 {
36  namespace detail
37  {
38  template<typename = void>
39  [[noreturn]] void assert_failure(char const * file, int line, char const * msg)
40  {
41  std::fprintf(stderr, "%s(%d): %s\n", file, line, msg);
42  std::abort();
43  }
44  } // namespace detail
45 } // namespace ranges
46 
47 #endif
48 
49 #ifndef RANGES_ASSERT
50 // Always use our hand-rolled assert implementation on older GCCs, which do
51 // not allow assert to be used in a constant expression, and on MSVC whose
52 // assert is not marked [[noreturn]].
53 #if !defined(NDEBUG) && ((defined(__GNUC__) && !defined(__clang__) && \
54  (__GNUC__ < 5 || defined(__MINGW32__))) || \
55  defined(_MSVC_STL_VERSION))
56 #define RANGES_ASSERT(...) \
57  static_cast<void>((__VA_ARGS__) \
58  ? void(0) \
59  : ::ranges::detail::assert_failure( \
60  __FILE__, __LINE__, "assertion failed: " #__VA_ARGS__))
61 #else
62 #include <cassert>
63 #define RANGES_ASSERT assert
64 #endif
65 #endif
66 
67 #include <meta/meta_fwd.hpp>
68 
69 #ifndef RANGES_ASSUME
70 #if defined(__clang__) || defined(__GNUC__)
71 #define RANGES_ASSUME(COND) static_cast<void>((COND) ? void(0) : __builtin_unreachable())
72 #elif defined(_MSC_VER)
73 #define RANGES_ASSUME(COND) static_cast<void>(__assume(COND))
74 #else
75 #define RANGES_ASSUME(COND) static_cast<void>(COND)
76 #endif
77 #endif // RANGES_ASSUME
78 
79 #ifndef RANGES_EXPECT
80 #ifdef NDEBUG
81 #define RANGES_EXPECT(COND) RANGES_ASSUME(COND)
82 #else // NDEBUG
83 #define RANGES_EXPECT(COND) RANGES_ASSERT(COND)
84 #endif // NDEBUG
85 #endif // RANGES_EXPECT
86 
87 #ifndef RANGES_ENSURE_MSG
88 #if defined(NDEBUG)
89 #define RANGES_ENSURE_MSG(COND, MSG) \
90  static_cast<void>((COND) ? void(0) \
91  : ::ranges::detail::assert_failure( \
92  __FILE__, __LINE__, "ensure failed: " MSG))
93 #else
94 #define RANGES_ENSURE_MSG(COND, MSG) RANGES_ASSERT((COND) && MSG)
95 #endif
96 #endif
97 
98 #ifndef RANGES_ENSURE
99 #define RANGES_ENSURE(...) RANGES_ENSURE_MSG((__VA_ARGS__), #__VA_ARGS__)
100 #endif
101 
102 #define RANGES_DECLTYPE_AUTO_RETURN(...) \
103  ->decltype(__VA_ARGS__) \
104  { \
105  return (__VA_ARGS__); \
106  } \
107 
108 
109 #define RANGES_DECLTYPE_AUTO_RETURN_NOEXCEPT(...) \
110  noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__)))->decltype(__VA_ARGS__) \
111  { \
112  return (__VA_ARGS__); \
113  } \
114 
115 
116 #define RANGES_AUTO_RETURN_NOEXCEPT(...) \
117  noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__))) \
118  { \
119  return (__VA_ARGS__); \
120  } \
121 
122 
123 #define RANGES_DECLTYPE_NOEXCEPT(...) \
124  noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__)))->decltype(__VA_ARGS__)
125 
126 // Non-portable forward declarations of standard containers
127 #define RANGES_BEGIN_NAMESPACE_STD META_BEGIN_NAMESPACE_STD
128 #define RANGES_END_NAMESPACE_STD META_END_NAMESPACE_STD
129 #define RANGES_BEGIN_NAMESPACE_VERSION META_BEGIN_NAMESPACE_VERSION
130 #define RANGES_END_NAMESPACE_VERSION META_END_NAMESPACE_VERSION
131 #define RANGES_BEGIN_NAMESPACE_CONTAINER META_BEGIN_NAMESPACE_CONTAINER
132 #define RANGES_END_NAMESPACE_CONTAINER META_END_NAMESPACE_CONTAINER
133 
134 // Database of feature versions
135 #define RANGES_CXX_STATIC_ASSERT_11 200410L
136 #define RANGES_CXX_STATIC_ASSERT_14 RANGES_CXX_STATIC_ASSERT_11
137 #define RANGES_CXX_STATIC_ASSERT_17 201411L
138 #define RANGES_CXX_VARIABLE_TEMPLATES_11 0L
139 #define RANGES_CXX_VARIABLE_TEMPLATES_14 201304L
140 #define RANGES_CXX_VARIABLE_TEMPLATES_17 RANGES_CXX_VARIABLE_TEMPLATES_14
141 #define RANGES_CXX_ATTRIBUTE_DEPRECATED_11 0L
142 #define RANGES_CXX_ATTRIBUTE_DEPRECATED_14 201309L
143 #define RANGES_CXX_ATTRIBUTE_DEPRECATED_17 RANGES_CXX_ATTRIBUTE_DEPRECATED_14
144 #define RANGES_CXX_CONSTEXPR_11 200704L
145 #define RANGES_CXX_CONSTEXPR_14 201304L
146 #define RANGES_CXX_CONSTEXPR_17 201603L
147 #define RANGES_CXX_CONSTEXPR_20 201907L
148 #define RANGES_CXX_CONSTEXPR_LAMBDAS 201603L
149 #define RANGES_CXX_RANGE_BASED_FOR_11 200907L
150 #define RANGES_CXX_RANGE_BASED_FOR_14 RANGES_CXX_RANGE_BASED_FOR_11
151 #define RANGES_CXX_RANGE_BASED_FOR_17 201603L
152 #define RANGES_CXX_LIB_IS_FINAL_11 0L
153 #define RANGES_CXX_LIB_IS_FINAL_14 201402L
154 #define RANGES_CXX_LIB_IS_FINAL_17 RANGES_CXX_LIB_IS_FINAL_14
155 #define RANGES_CXX_RETURN_TYPE_DEDUCTION_11 0L
156 #define RANGES_CXX_RETURN_TYPE_DEDUCTION_14 201304L
157 #define RANGES_CXX_RETURN_TYPE_DEDUCTION_17 RANGES_CXX_RETURN_TYPE_DEDUCTION_14
158 #define RANGES_CXX_GENERIC_LAMBDAS_11 0L
159 #define RANGES_CXX_GENERIC_LAMBDAS_14 201304L
160 #define RANGES_CXX_GENERIC_LAMBDAS_17 RANGES_CXX_GENERIC_LAMBDAS_14
161 #define RANGES_CXX_STD_11 201103L
162 #define RANGES_CXX_STD_14 201402L
163 #define RANGES_CXX_STD_17 201703L
164 #define RANGES_CXX_THREAD_LOCAL_PRE_STANDARD \
165  200000L // Arbitrary number between 0 and C++11
166 #define RANGES_CXX_THREAD_LOCAL_11 RANGES_CXX_STD_11
167 #define RANGES_CXX_THREAD_LOCAL_14 RANGES_CXX_THREAD_LOCAL_11
168 #define RANGES_CXX_THREAD_LOCAL_17 RANGES_CXX_THREAD_LOCAL_14
169 #define RANGES_CXX_INLINE_VARIABLES_11 0L
170 #define RANGES_CXX_INLINE_VARIABLES_14 0L
171 #define RANGES_CXX_INLINE_VARIABLES_17 201606L
172 #define RANGES_CXX_COROUTINES_11 0L
173 #define RANGES_CXX_COROUTINES_14 0L
174 #define RANGES_CXX_COROUTINES_17 0L
175 #define RANGES_CXX_COROUTINES_TS1 201703L
176 #define RANGES_CXX_DEDUCTION_GUIDES_11 0L
177 #define RANGES_CXX_DEDUCTION_GUIDES_14 0L
178 #define RANGES_CXX_DEDUCTION_GUIDES_17 201606L
179 #define RANGES_CXX_IF_CONSTEXPR_11 0L
180 #define RANGES_CXX_IF_CONSTEXPR_14 0L
181 #define RANGES_CXX_IF_CONSTEXPR_17 201606L
182 #define RANGES_CXX_ALIGNED_NEW_11 0L
183 #define RANGES_CXX_ALIGNED_NEW_14 0L
184 #define RANGES_CXX_ALIGNED_NEW_17 201606L
185 
186 // Implementation-specific diagnostic control
187 #if defined(_MSC_VER) && !defined(__clang__)
188 #define RANGES_DIAGNOSTIC_PUSH __pragma(warning(push))
189 #define RANGES_DIAGNOSTIC_POP __pragma(warning(pop))
190 #define RANGES_DIAGNOSTIC_IGNORE_PRAGMAS __pragma(warning(disable : 4068))
191 #define RANGES_DIAGNOSTIC_IGNORE(X) \
192  RANGES_DIAGNOSTIC_IGNORE_PRAGMAS __pragma(warning(disable : X))
193 #define RANGES_DIAGNOSTIC_IGNORE_SHADOWING RANGES_DIAGNOSTIC_IGNORE(4456)
194 #define RANGES_DIAGNOSTIC_IGNORE_INDENTATION
195 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_INTERNAL
196 #define RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS RANGES_DIAGNOSTIC_IGNORE(4099)
197 #define RANGES_DIAGNOSTIC_IGNORE_GLOBAL_CONSTRUCTORS
198 #define RANGES_DIAGNOSTIC_IGNORE_SIGN_CONVERSION
199 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_INTERNAL
200 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_MEMBER
201 #define RANGES_DIAGNOSTIC_IGNORE_ZERO_LENGTH_ARRAY
202 #define RANGES_DIAGNOSTIC_IGNORE_CXX17_COMPAT
203 #define RANGES_DIAGNOSTIC_IGNORE_CXX2A_COMPAT
204 #define RANGES_DIAGNOSTIC_IGNORE_FLOAT_EQUAL
205 #define RANGES_DIAGNOSTIC_IGNORE_FLOAT_CONVERSION
206 #define RANGES_DIAGNOSTIC_IGNORE_MISSING_BRACES
207 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_FUNC_TEMPLATE
208 #define RANGES_DIAGNOSTIC_IGNORE_INCONSISTENT_OVERRIDE
209 #define RANGES_DIAGNOSTIC_IGNORE_RANGE_LOOP_ANALYSIS
210 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS RANGES_DIAGNOSTIC_IGNORE(4996)
211 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_THIS_CAPTURE
212 #define RANGES_DIAGNOSTIC_IGNORE_INIT_LIST_LIFETIME
213 // Ignores both "divide by zero" and "mod by zero":
214 #define RANGES_DIAGNOSTIC_IGNORE_DIVIDE_BY_ZERO RANGES_DIAGNOSTIC_IGNORE(4723 4724)
215 #define RANGES_DIAGNOSTIC_IGNORE_UNSIGNED_MATH RANGES_DIAGNOSTIC_IGNORE(4146)
216 #define RANGES_DIAGNOSTIC_IGNORE_TRUNCATION RANGES_DIAGNOSTIC_IGNORE(4244)
217 #define RANGES_DIAGNOSTIC_IGNORE_MULTIPLE_ASSIGNMENT_OPERATORS \
218  RANGES_DIAGNOSTIC_IGNORE(4522)
219 #define RANGES_DIAGNOSTIC_IGNORE_VOID_PTR_DEREFERENCE
220 #define RANGES_DIAGNOSTIC_KEYWORD_MACRO
221 #define RANGES_DIAGNOSTIC_SUGGEST_OVERRIDE
222 
223 #define RANGES_CXX_VER _MSVC_LANG
224 
225 #if _MSC_VER < 1920 || _MSVC_LANG < 201703L
226 #error range-v3 requires Visual Studio 2019 with the /std:c++17 (or /std:c++latest) and /permissive- options.
227 #endif
228 
229 #if _MSC_VER < 1927
230 #define RANGES_WORKAROUND_MSVC_895622 // Error when phase 1 name binding finds only
231  // deleted function
232 
233 #if _MSC_VER < 1925
234 #define RANGES_WORKAROUND_MSVC_779708 // ADL for operands of function type [No workaround]
235 
236 #if _MSC_VER < 1923
237 #define RANGES_WORKAROUND_MSVC_573728 // rvalues of array types bind to lvalue references
238  // [no workaround]
239 #define RANGES_WORKAROUND_MSVC_934330 // Deduction guide not correctly preferred to copy
240  // deduction candidate [No workaround]
241 
242 #if _MSC_VER < 1922
243 #define RANGES_WORKAROUND_MSVC_756601 // constexpr friend non-template erroneously
244  // rejected with C3615
245 #define RANGES_WORKAROUND_MSVC_793042 // T[0] sometimes accepted as a valid type in SFINAE
246  // context
247 
248 #if _MSC_VER < 1921
249 #define RANGES_WORKAROUND_MSVC_785522 // SFINAE failure for error in immediate context
250 #define RANGES_WORKAROUND_MSVC_786376 // Assertion casting anonymous union member in
251  // trailing-return-type
252 #define RANGES_WORKAROUND_MSVC_787074 // Over-eager substitution of dependent type in
253  // non-instantiated nested class template
254 #define RANGES_WORKAROUND_MSVC_790554 // Assert for return type that uses dependent
255  // default non-type template argument
256 #endif // _MSC_VER < 1921
257 #endif // _MSC_VER < 1922
258 #endif // _MSC_VER < 1923
259 #endif // _MSC_VER < 1925
260 #endif // _MSC_VER < 1926
261 
262 #if 1 // Fixed in 1920, but more bugs hiding behind workaround
263 #define RANGES_WORKAROUND_MSVC_701385 // Yet another alias expansion error
264 #endif
265 
266 #define RANGES_WORKAROUND_MSVC_249830 // constexpr and arguments that aren't subject to
267  // lvalue-to-rvalue conversion
268 #define RANGES_WORKAROUND_MSVC_677925 // Bogus C2676 "binary '++': '_Ty' does not define
269  // this operator"
270 #define RANGES_WORKAROUND_MSVC_683388 // decltype(*i) is incorrectly an rvalue reference
271  // for pointer-to-array i
272 #define RANGES_WORKAROUND_MSVC_688606 // SFINAE failing to account for access control
273  // during specialization matching
274 #define RANGES_WORKAROUND_MSVC_786312 // Yet another mixed-pack-expansion failure
275 #define RANGES_WORKAROUND_MSVC_792338 // Failure to match specialization enabled via call
276  // to constexpr function
277 #define RANGES_WORKAROUND_MSVC_835948 // Silent bad codegen destroying sized_generator [No
278  // workaround]
279 #define RANGES_WORKAROUND_MSVC_934264 // Explicitly-defaulted inherited default
280  // constructor is not correctly implicitly constexpr
281 #if _MSVC_LANG <= 201703L
282 #define RANGES_WORKAROUND_MSVC_OLD_LAMBDA
283 #endif
284 
285 #if _MSVC_LANG <= 201703L
286 #define RANGES_WORKAROUND_MSVC_UNUSABLE_SPAN // MSVC provides a <span> header that is
287  // guarded against use with std <= 17
288 #endif
289 
290 #elif defined(__GNUC__) || defined(__clang__)
291 #define RANGES_PRAGMA(X) _Pragma(#X)
292 #define RANGES_DIAGNOSTIC_PUSH RANGES_PRAGMA(GCC diagnostic push)
293 #define RANGES_DIAGNOSTIC_POP RANGES_PRAGMA(GCC diagnostic pop)
294 #define RANGES_DIAGNOSTIC_IGNORE_PRAGMAS RANGES_PRAGMA(GCC diagnostic ignored "-Wpragmas")
295 #define RANGES_DIAGNOSTIC_IGNORE(X) \
296  RANGES_DIAGNOSTIC_IGNORE_PRAGMAS \
297  RANGES_PRAGMA(GCC diagnostic ignored "-Wunknown-pragmas") \
298  RANGES_PRAGMA(GCC diagnostic ignored "-Wunknown-warning-option") \
299  RANGES_PRAGMA(GCC diagnostic ignored X)
300 #define RANGES_DIAGNOSTIC_IGNORE_SHADOWING RANGES_DIAGNOSTIC_IGNORE("-Wshadow")
301 #define RANGES_DIAGNOSTIC_IGNORE_INDENTATION \
302  RANGES_DIAGNOSTIC_IGNORE("-Wmisleading-indentation")
303 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_INTERNAL \
304  RANGES_DIAGNOSTIC_IGNORE("-Wundefined-internal")
305 #define RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS \
306  RANGES_DIAGNOSTIC_IGNORE("-Wmismatched-tags")
307 #define RANGES_DIAGNOSTIC_IGNORE_SIGN_CONVERSION \
308  RANGES_DIAGNOSTIC_IGNORE("-Wsign-conversion")
309 #define RANGES_DIAGNOSTIC_IGNORE_FLOAT_EQUAL RANGES_DIAGNOSTIC_IGNORE("-Wfloat-equal")
310 #define RANGES_DIAGNOSTIC_IGNORE_FLOAT_CONVERSION RANGES_DIAGNOSTIC_IGNORE("-Wfloat-conversion")
311 #define RANGES_DIAGNOSTIC_IGNORE_MISSING_BRACES \
312  RANGES_DIAGNOSTIC_IGNORE("-Wmissing-braces")
313 #define RANGES_DIAGNOSTIC_IGNORE_GLOBAL_CONSTRUCTORS \
314  RANGES_DIAGNOSTIC_IGNORE("-Wglobal-constructors")
315 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_INTERNAL \
316  RANGES_DIAGNOSTIC_IGNORE("-Wunneeded-internal-declaration")
317 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_MEMBER \
318  RANGES_DIAGNOSTIC_IGNORE("-Wunneeded-member-function")
319 #define RANGES_DIAGNOSTIC_IGNORE_ZERO_LENGTH_ARRAY \
320  RANGES_DIAGNOSTIC_IGNORE("-Wzero-length-array")
321 #define RANGES_DIAGNOSTIC_IGNORE_CXX17_COMPAT RANGES_DIAGNOSTIC_IGNORE("-Wc++1z-compat")
322 #define RANGES_DIAGNOSTIC_IGNORE_CXX2A_COMPAT RANGES_DIAGNOSTIC_IGNORE("-Wc++2a-compat")
323 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_FUNC_TEMPLATE \
324  RANGES_DIAGNOSTIC_IGNORE("-Wundefined-func-template")
325 #define RANGES_DIAGNOSTIC_IGNORE_INCONSISTENT_OVERRIDE \
326  RANGES_DIAGNOSTIC_IGNORE("-Winconsistent-missing-override")
327 #define RANGES_DIAGNOSTIC_IGNORE_RANGE_LOOP_ANALYSIS \
328  RANGES_DIAGNOSTIC_IGNORE("-Wrange-loop-analysis")
329 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS \
330  RANGES_DIAGNOSTIC_IGNORE("-Wdeprecated-declarations")
331 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_THIS_CAPTURE \
332  RANGES_DIAGNOSTIC_IGNORE("-Wdeprecated-this-capture")
333 #define RANGES_DIAGNOSTIC_IGNORE_INIT_LIST_LIFETIME \
334  RANGES_DIAGNOSTIC_IGNORE("-Winit-list-lifetime")
335 #define RANGES_DIAGNOSTIC_IGNORE_DIVIDE_BY_ZERO
336 #define RANGES_DIAGNOSTIC_IGNORE_UNSIGNED_MATH
337 #define RANGES_DIAGNOSTIC_IGNORE_TRUNCATION
338 #define RANGES_DIAGNOSTIC_IGNORE_MULTIPLE_ASSIGNMENT_OPERATORS
339 #define RANGES_DIAGNOSTIC_IGNORE_VOID_PTR_DEREFERENCE \
340  RANGES_DIAGNOSTIC_IGNORE("-Wvoid-ptr-dereference")
341 #define RANGES_DIAGNOSTIC_KEYWORD_MACRO RANGES_DIAGNOSTIC_IGNORE("-Wkeyword-macro")
342 #define RANGES_DIAGNOSTIC_SUGGEST_OVERRIDE RANGES_DIAGNOSTIC_IGNORE("-Wsuggest-override")
343 
344 #define RANGES_WORKAROUND_CWG_1554
345 #ifdef __clang__
346 #if __clang_major__ < 4
347 #define RANGES_WORKAROUND_CLANG_23135 // constexpr leads to premature instantiation on
348  // clang-3.x
349 #endif
350 #if (__clang_major__ >= 7 && __clang_major__ <= 9) || defined(__apple_build_version__)
351 #define RANGES_WORKAROUND_CLANG_43400 // template friend is redefinition of itself
352 #endif
353 #else // __GNUC__
354 #if __GNUC__ < 6
355 #define RANGES_WORKAROUND_GCC_UNFILED0 /* Workaround old GCC name lookup bug */
356 #endif
357 #if __GNUC__ == 7 || __GNUC__ == 8
358 #define RANGES_WORKAROUND_GCC_91525 /* Workaround strange GCC ICE */
359 #endif
360 #if __GNUC__ >= 9
361 #if __GNUC__ == 9 && __GNUC_MINOR__ < 3 && __cplusplus == RANGES_CXX_STD_17
362 #define RANGES_WORKAROUND_GCC_91923 // Failure-to-SFINAE with class type NTTP in C++17
363 #endif
364 #endif
365 #endif
366 
367 #else
368 #define RANGES_DIAGNOSTIC_PUSH
369 #define RANGES_DIAGNOSTIC_POP
370 #define RANGES_DIAGNOSTIC_IGNORE_PRAGMAS
371 #define RANGES_DIAGNOSTIC_IGNORE_SHADOWING
372 #define RANGES_DIAGNOSTIC_IGNORE_INDENTATION
373 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_INTERNAL
374 #define RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
375 #define RANGES_DIAGNOSTIC_IGNORE_GLOBAL_CONSTRUCTORS
376 #define RANGES_DIAGNOSTIC_IGNORE_SIGN_CONVERSION
377 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_INTERNAL
378 #define RANGES_DIAGNOSTIC_IGNORE_UNNEEDED_MEMBER
379 #define RANGES_DIAGNOSTIC_IGNORE_ZERO_LENGTH_ARRAY
380 #define RANGES_DIAGNOSTIC_IGNORE_CXX17_COMPAT
381 #define RANGES_DIAGNOSTIC_IGNORE_CXX2A_COMPAT
382 #define RANGES_DIAGNOSTIC_IGNORE_FLOAT_EQUAL
383 #define RANGES_DIAGNOSTIC_IGNORE_MISSING_BRACES
384 #define RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_FUNC_TEMPLATE
385 #define RANGES_DIAGNOSTIC_IGNORE_INCONSISTENT_OVERRIDE
386 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
387 #define RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_THIS_CAPTURE
388 #define RANGES_DIAGNOSTIC_IGNORE_INIT_LIST_LIFETIME
389 #define RANGES_DIAGNOSTIC_IGNORE_DIVIDE_BY_ZERO
390 #define RANGES_DIAGNOSTIC_IGNORE_UNSIGNED_MATH
391 #define RANGES_DIAGNOSTIC_IGNORE_TRUNCATION
392 #define RANGES_DIAGNOSTIC_IGNORE_MULTIPLE_ASSIGNMENT_OPERATORS
393 #define RANGES_DIAGNOSTIC_IGNORE_VOID_PTR_DEREFERENCE
394 #define RANGES_DIAGNOSTIC_KEYWORD_MACRO
395 #define RANGES_DIAGNOSTIC_SUGGEST_OVERRIDE
396 #endif
397 
398 // Configuration via feature-test macros, with fallback to __cplusplus
399 #ifndef RANGES_CXX_VER
400 #define RANGES_CXX_VER __cplusplus
401 #endif
402 
403 #define RANGES_CXX_FEATURE_CONCAT2(y, z) RANGES_CXX_##y##_##z
404 #define RANGES_CXX_FEATURE_CONCAT(y, z) RANGES_CXX_FEATURE_CONCAT2(y, z)
405 
406 #if RANGES_CXX_VER >= RANGES_CXX_STD_17
407 #define RANGES_CXX_STD RANGES_CXX_STD_17
408 #define RANGES_CXX_FEATURE(x) RANGES_CXX_FEATURE_CONCAT(x, 17)
409 #elif RANGES_CXX_VER >= RANGES_CXX_STD_14
410 #define RANGES_CXX_STD RANGES_CXX_STD_14
411 #define RANGES_CXX_FEATURE(x) RANGES_CXX_FEATURE_CONCAT(x, 14)
412 #else
413 #define RANGES_CXX_STD RANGES_CXX_STD_11
414 #define RANGES_CXX_FEATURE(x) RANGES_CXX_FEATURE_CONCAT(x, 11)
415 #endif
416 
417 #ifndef RANGES_CXX_STATIC_ASSERT
418 #ifdef __cpp_static_assert
419 #define RANGES_CXX_STATIC_ASSERT __cpp_static_assert
420 #else
421 #define RANGES_CXX_STATIC_ASSERT RANGES_CXX_FEATURE(STATIC_ASSERT)
422 #endif
423 #endif
424 
425 #ifndef RANGES_CXX_VARIABLE_TEMPLATES
426 #ifdef __cpp_variable_templates
427 #define RANGES_CXX_VARIABLE_TEMPLATES __cpp_variable_templates
428 #else
429 #define RANGES_CXX_VARIABLE_TEMPLATES RANGES_CXX_FEATURE(VARIABLE_TEMPLATES)
430 #endif
431 #endif
432 
433 #if(defined(__cpp_lib_type_trait_variable_templates) && \
434  __cpp_lib_type_trait_variable_templates > 0) || \
435  RANGES_CXX_VER >= RANGES_CXX_STD_17
436 #define RANGES_CXX_TRAIT_VARIABLE_TEMPLATES 1
437 #else
438 #define RANGES_CXX_TRAIT_VARIABLE_TEMPLATES 0
439 #endif
440 
441 #ifndef RANGES_CXX_ATTRIBUTE_DEPRECATED
442 #ifdef __has_cpp_attribute
443 #define RANGES_CXX_ATTRIBUTE_DEPRECATED __has_cpp_attribute(deprecated)
444 #elif defined(__cpp_attribute_deprecated)
445 #define RANGES_CXX_ATTRIBUTE_DEPRECATED __cpp_attribute_deprecated
446 #else
447 #define RANGES_CXX_ATTRIBUTE_DEPRECATED RANGES_CXX_FEATURE(ATTRIBUTE_DEPRECATED)
448 #endif
449 #endif
450 
451 #ifndef RANGES_CXX_CONSTEXPR
452 #ifdef __cpp_constexpr
453 #define RANGES_CXX_CONSTEXPR __cpp_constexpr
454 #else
455 #define RANGES_CXX_CONSTEXPR RANGES_CXX_FEATURE(CONSTEXPR)
456 #endif
457 #endif
458 
459 #ifndef RANGES_CXX_RANGE_BASED_FOR
460 #ifdef __cpp_range_based_for
461 #define RANGES_CXX_RANGE_BASED_FOR __cpp_range_based_for
462 #else
463 #define RANGES_CXX_RANGE_BASED_FOR RANGES_CXX_FEATURE(RANGE_BASED_FOR)
464 #endif
465 #endif
466 
467 #ifndef RANGES_CXX_LIB_IS_FINAL
468 #include <type_traits>
469 #ifdef __cpp_lib_is_final
470 #define RANGES_CXX_LIB_IS_FINAL __cpp_lib_is_final
471 #else
472 #define RANGES_CXX_LIB_IS_FINAL RANGES_CXX_FEATURE(LIB_IS_FINAL)
473 #endif
474 #endif
475 
476 #ifndef RANGES_CXX_RETURN_TYPE_DEDUCTION
477 #ifdef __cpp_return_type_deduction
478 #define RANGES_CXX_RETURN_TYPE_DEDUCTION __cpp_return_type_deduction
479 #else
480 #define RANGES_CXX_RETURN_TYPE_DEDUCTION RANGES_CXX_FEATURE(RETURN_TYPE_DEDUCTION)
481 #endif
482 #endif
483 
484 #ifndef RANGES_CXX_GENERIC_LAMBDAS
485 #ifdef __cpp_generic_lambdas
486 #define RANGES_CXX_GENERIC_LAMBDAS __cpp_generic_lambdas
487 #else
488 #define RANGES_CXX_GENERIC_LAMBDAS RANGES_CXX_FEATURE(GENERIC_LAMBDAS)
489 #endif
490 #endif
491 
492 #ifndef RANGES_CXX_THREAD_LOCAL
493 #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED <= 70100
494 #define RANGES_CXX_THREAD_LOCAL 0
495 #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) || \
496  (defined(__clang__) && (defined(__CYGWIN__) || defined(__apple_build_version__)))
497 // BUGBUG avoid unresolved __cxa_thread_atexit
498 #define RANGES_CXX_THREAD_LOCAL RANGES_CXX_THREAD_LOCAL_PRE_STANDARD
499 #else
500 #define RANGES_CXX_THREAD_LOCAL RANGES_CXX_FEATURE(THREAD_LOCAL)
501 #endif
502 #endif
503 
504 #if !defined(RANGES_DEPRECATED) && !defined(RANGES_DISABLE_DEPRECATED_WARNINGS)
505 #if defined(__GNUC__) && !defined(__clang__)
506 // GCC's support for [[deprecated("message")]] is unusably buggy.
507 #define RANGES_DEPRECATED(MSG) __attribute__((deprecated(MSG)))
508 #elif RANGES_CXX_ATTRIBUTE_DEPRECATED && \
509  !((defined(__clang__) || defined(__GNUC__)) && RANGES_CXX_STD < RANGES_CXX_STD_14)
510 #define RANGES_DEPRECATED(MSG) [[deprecated(MSG)]]
511 #elif defined(__clang__) || defined(__GNUC__)
512 #define RANGES_DEPRECATED(MSG) __attribute__((deprecated(MSG)))
513 #endif
514 #endif
515 #ifndef RANGES_DEPRECATED
516 #define RANGES_DEPRECATED(MSG)
517 #endif
518 
519 #if !defined(RANGES_DEPRECATED_HEADER) && !defined(RANGES_DISABLE_DEPRECATED_WARNINGS)
520 #ifdef __GNUC__
521 #define RANGES_DEPRECATED_HEADER(MSG) RANGES_PRAGMA(GCC warning MSG)
522 #elif defined(_MSC_VER)
523 #define RANGES_STRINGIZE_(MSG) #MSG
524 #define RANGES_STRINGIZE(MSG) RANGES_STRINGIZE_(MSG)
525 #define RANGES_DEPRECATED_HEADER(MSG) \
526  __pragma(message(__FILE__ "(" RANGES_STRINGIZE(__LINE__) ") : Warning: " MSG))
527 #endif
528 #else
529 #define RANGES_DEPRECATED_HEADER(MSG)
530 #endif
531 // #ifndef RANGES_DEPRECATED_HEADER
532 // #define RANGES_DEPRECATED_HEADER(MSG)
533 // #endif
534 
535 #ifndef RANGES_CXX_COROUTINES
536 #if defined(__cpp_coroutines) && defined(__has_include)
537 #if __has_include(<coroutine>)
538 #define RANGES_CXX_COROUTINES __cpp_coroutines
539 #define RANGES_COROUTINES_HEADER <coroutine>
540 #define RANGES_COROUTINES_NS std
541 #elif __has_include(<experimental/coroutine>)
542 #define RANGES_CXX_COROUTINES __cpp_coroutines
543 #define RANGES_COROUTINES_HEADER <experimental/coroutine>
544 #define RANGES_COROUTINES_NS std::experimental
545 #endif
546 #endif
547 #ifndef RANGES_CXX_COROUTINES
548 #define RANGES_CXX_COROUTINES RANGES_CXX_FEATURE(COROUTINES)
549 #endif
550 #endif
551 
552 #ifdef NDEBUG
553 #define RANGES_NDEBUG_CONSTEXPR constexpr
554 #else
555 #define RANGES_NDEBUG_CONSTEXPR inline
556 #endif
557 
558 #ifndef RANGES_CXX_INLINE_VARIABLES
559 #ifdef __cpp_inline_variables
560 #define RANGES_CXX_INLINE_VARIABLES __cpp_inline_variables
561 #elif defined(__clang__) && (__clang_major__ == 3 && __clang_minor__ == 9) && \
562  RANGES_CXX_VER > RANGES_CXX_STD_14
563 // Clang 3.9 supports inline variables in C++17 mode, but doesn't define
564 // __cpp_inline_variables
565 #define RANGES_CXX_INLINE_VARIABLES RANGES_CXX_INLINE_VARIABLES_17
566 #else
567 #define RANGES_CXX_INLINE_VARIABLES RANGES_CXX_FEATURE(INLINE_VARIABLES)
568 #endif // __cpp_inline_variables
569 #endif // RANGES_CXX_INLINE_VARIABLES
570 
571 #if RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17 && \
572  !defined(RANGES_DOXYGEN_INVOKED)
573 #define RANGES_INLINE_VAR
574 #define RANGES_INLINE_VARIABLE(type, name) \
575  namespace \
576  { \
577  constexpr auto & name = ::ranges::static_const<type>::value; \
578  }
579 #else // RANGES_CXX_INLINE_VARIABLES >= RANGES_CXX_INLINE_VARIABLES_17
580 #define RANGES_INLINE_VAR inline
581 #define RANGES_INLINE_VARIABLE(type, name) \
582  inline constexpr type name{}; \
583 
584 #endif // RANGES_CXX_INLINE_VARIABLES
585 
586 #if defined(RANGES_DOXYGEN_INVOKED)
587 #define RANGES_DEFINE_CPO(type, name) \
588  inline constexpr type name{}; \
589 
590 #elif RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17
591 #define RANGES_DEFINE_CPO(type, name) \
592  namespace \
593  { \
594  constexpr auto & name = ::ranges::static_const<type>::value; \
595  } \
596 
597 #else // RANGES_CXX_INLINE_VARIABLES >= RANGES_CXX_INLINE_VARIABLES_17
598 #define RANGES_DEFINE_CPO(type, name) \
599  namespace _ \
600  { \
601  inline constexpr type name{}; \
602  } \
603  using namespace _; \
604 
605 #endif // RANGES_CXX_INLINE_VARIABLES
606 
607 #ifndef RANGES_DOXYGEN_INVOKED
608 #define RANGES_HIDDEN_DETAIL(...) __VA_ARGS__
609 #else
610 #define RANGES_HIDDEN_DETAIL(...)
611 #endif
612 
613 #ifndef RANGES_DOXYGEN_INVOKED
614 #define RANGES_ADL_BARRIER_FOR(S) S##_ns
615 #define RANGES_STRUCT_WITH_ADL_BARRIER(S) \
616  _ranges_adl_barrier_noop_; \
617  namespace RANGES_ADL_BARRIER_FOR(S) \
618  { \
619  struct S; \
620  } \
621  using RANGES_ADL_BARRIER_FOR(S)::S; \
622  struct RANGES_ADL_BARRIER_FOR(S)::S
623 #else
624 #define RANGES_ADL_BARRIER_FOR(S)
625 #define RANGES_STRUCT_WITH_ADL_BARRIER(S) S
626 #endif
627 
628 #ifndef RANGES_DOXYGEN_INVOKED
629 #define RANGES_FUNC_BEGIN(NAME) \
630  struct NAME##_fn \
631  {
632 #define RANGES_FUNC_END(NAME) \
633  } \
634  ; \
635  RANGES_INLINE_VARIABLE(NAME##_fn, NAME)
636 #define RANGES_FUNC(NAME) operator() RANGES_FUNC_CONST_
637 #define RANGES_FUNC_CONST_(...) (__VA_ARGS__) const
638 #else
639 #define RANGES_FUNC_BEGIN(NAME)
640 #define RANGES_FUNC_END(NAME)
641 #define RANGES_FUNC(NAME) NAME
642 #endif
643 
644 #ifndef RANGES_CXX_DEDUCTION_GUIDES
645 #if defined(__clang__) && defined(__apple_build_version__)
646 // Apple's clang version doesn't do deduction guides very well.
647 #define RANGES_CXX_DEDUCTION_GUIDES 0
648 #elif defined(__cpp_deduction_guides)
649 #define RANGES_CXX_DEDUCTION_GUIDES __cpp_deduction_guides
650 #else
651 #define RANGES_CXX_DEDUCTION_GUIDES RANGES_CXX_FEATURE(DEDUCTION_GUIDES)
652 #endif // __cpp_deduction_guides
653 #endif // RANGES_CXX_DEDUCTION_GUIDES
654 
655 // __VA_OPT__
656 #ifndef RANGES_CXX_VA_OPT
657 #if __cplusplus > 201703L
658 #define RANGES_CXX_THIRD_ARG_(A, B, C, ...) C
659 #define RANGES_CXX_VA_OPT_I_(...) RANGES_CXX_THIRD_ARG_(__VA_OPT__(, ), 1, 0, ?)
660 #define RANGES_CXX_VA_OPT RANGES_CXX_VA_OPT_I_(?)
661 #else
662 #define RANGES_CXX_VA_OPT 0
663 #endif
664 #endif // RANGES_CXX_VA_OPT
665 
666 #ifndef RANGES_CXX_IF_CONSTEXPR
667 #ifdef __cpp_if_constexpr
668 #define RANGES_CXX_IF_CONSTEXPR __cpp_if_constexpr
669 #else
670 #define RANGES_CXX_IF_CONSTEXPR RANGES_CXX_FEATURE(IF_CONSTEXPR)
671 #endif
672 #endif // RANGES_CXX_IF_CONSTEXPR
673 
674 // Its not enough for the compiler to support this; the stdlib must support it too.
675 #ifndef RANGES_CXX_ALIGNED_NEW
676 #if(!defined(_LIBCPP_VERSION) || \
677  (_LIBCPP_VERSION >= 4000 && !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION))) && \
678  (!defined(__GLIBCXX__) || (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 7))
679 #if defined(__cpp_aligned_new)
680 #define RANGES_CXX_ALIGNED_NEW __cpp_aligned_new
681 #else
682 #define RANGES_CXX_ALIGNED_NEW RANGES_CXX_FEATURE(ALIGNED_NEW)
683 #endif
684 #else // _LIBCPP_VERSION < 4000 || __GLIBCXX__ < 20170502
685 #define RANGES_CXX_ALIGNED_NEW 0L
686 #endif
687 #endif // RANGES_CXX_ALIGNED_NEW
688 
689 #if defined(__clang__)
690 #define RANGES_IS_SAME(...) __is_same(__VA_ARGS__)
691 #elif defined(__GNUC__) && __GNUC__ >= 6
692 #define RANGES_IS_SAME(...) __is_same_as(__VA_ARGS__)
693 #elif RANGES_CXX_TRAIT_VARIABLE_TEMPLATES
694 #define RANGES_IS_SAME(...) std::is_same_v<__VA_ARGS__>
695 #else
696 #define RANGES_IS_SAME(...) std::is_same<__VA_ARGS__>::value
697 #endif
698 
699 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93667
700 #if defined(__has_cpp_attribute) && __has_cpp_attribute(no_unique_address) && \
701  !(defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 10)
702 #define RANGES_NO_UNIQUE_ADDRESS [[no_unique_address]]
703 #else
704 #define RANGES_NO_UNIQUE_ADDRESS
705 #endif
706 
707 #if defined(__clang__)
708 #if __has_attribute(no_sanitize)
709 #define RANGES_INTENDED_MODULAR_ARITHMETIC \
710  __attribute__((__no_sanitize__("unsigned-integer-overflow")))
711 #else
712 #define RANGES_INTENDED_MODULAR_ARITHMETIC
713 #endif
714 #else
715 #define RANGES_INTENDED_MODULAR_ARITHMETIC
716 #endif
717 
718 #ifndef RANGES_CONSTEXPR_IF
719 #if RANGES_CXX_IF_CONSTEXPR >= RANGES_CXX_IF_CONSTEXPR_17
720 #define RANGES_CONSTEXPR_IF(...) false) \
721  {} else if constexpr(__VA_ARGS__
722 #else
723 #define RANGES_CONSTEXPR_IF(...) __VA_ARGS__
724 #endif
725 #endif // RANGES_CONSTEXPR_IF
726 
727 #if !defined(RANGES_BROKEN_CPO_LOOKUP) && !defined(RANGES_DOXYGEN_INVOKED) && \
728  (defined(RANGES_WORKAROUND_GCC_UNFILED0) || defined(RANGES_WORKAROUND_MSVC_895622))
729 #define RANGES_BROKEN_CPO_LOOKUP 1
730 #endif
731 #ifndef RANGES_BROKEN_CPO_LOOKUP
732 #define RANGES_BROKEN_CPO_LOOKUP 0
733 #endif
734 
735 #ifndef RANGES_NODISCARD
736 #if defined(__has_cpp_attribute) && __has_cpp_attribute(nodiscard)
737 #if defined(__clang__) && __cplusplus < 201703L
738 // clang complains about using nodiscard in C++14 mode.
739 #define RANGES_NODISCARD \
740  RANGES_DIAGNOSTIC_PUSH \
741  RANGES_DIAGNOSTIC_IGNORE("-Wc++1z-extensions") \
742  [[nodiscard]] RANGES_DIAGNOSTIC_POP
743 #else
744 #define RANGES_NODISCARD [[nodiscard]]
745 #endif
746 #else
747 #define RANGES_NODISCARD
748 #endif
749 #endif
750 
751 #ifndef RANGES_EMPTY_BASES
752 #ifdef _MSC_VER
753 #define RANGES_EMPTY_BASES __declspec(empty_bases)
754 #else
755 #define RANGES_EMPTY_BASES
756 #endif
757 #endif
758 
759 #endif
Forward declarations.