14 #ifndef RANGES_V3_DETAIL_CONFIG_HPP
15 #define RANGES_V3_DETAIL_CONFIG_HPP
20 #elif __has_include(<version>)
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)))
38 template<
typename =
void>
39 [[noreturn]]
void assert_failure(
char const * file,
int line,
char const * msg)
41 std::fprintf(stderr,
"%s(%d): %s\n", file, line, msg);
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__) \
59 : ::ranges::detail::assert_failure( \
60 __FILE__, __LINE__, "assertion failed: " #__VA_ARGS__))
63 #define RANGES_ASSERT assert
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))
75 #define RANGES_ASSUME(COND) static_cast<void>(COND)
81 #define RANGES_EXPECT(COND) RANGES_ASSUME(COND)
83 #define RANGES_EXPECT(COND) RANGES_ASSERT(COND)
87 #ifndef RANGES_ENSURE_MSG
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))
94 #define RANGES_ENSURE_MSG(COND, MSG) RANGES_ASSERT((COND) && MSG)
99 #define RANGES_ENSURE(...) RANGES_ENSURE_MSG((__VA_ARGS__), #__VA_ARGS__)
102 #define RANGES_DECLTYPE_AUTO_RETURN(...) \
103 ->decltype(__VA_ARGS__) \
105 return (__VA_ARGS__); \
109 #define RANGES_DECLTYPE_AUTO_RETURN_NOEXCEPT(...) \
110 noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__)))->decltype(__VA_ARGS__) \
112 return (__VA_ARGS__); \
116 #define RANGES_AUTO_RETURN_NOEXCEPT(...) \
117 noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__))) \
119 return (__VA_ARGS__); \
123 #define RANGES_DECLTYPE_NOEXCEPT(...) \
124 noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__)))->decltype(__VA_ARGS__)
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
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 \
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
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
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
223 #define RANGES_CXX_VER _MSVC_LANG
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.
230 #define RANGES_WORKAROUND_MSVC_895622
234 #define RANGES_WORKAROUND_MSVC_779708
237 #define RANGES_WORKAROUND_MSVC_573728
239 #define RANGES_WORKAROUND_MSVC_934330
243 #define RANGES_WORKAROUND_MSVC_756601
245 #define RANGES_WORKAROUND_MSVC_793042
249 #define RANGES_WORKAROUND_MSVC_785522
250 #define RANGES_WORKAROUND_MSVC_786376
252 #define RANGES_WORKAROUND_MSVC_787074
254 #define RANGES_WORKAROUND_MSVC_790554
263 #define RANGES_WORKAROUND_MSVC_701385
266 #define RANGES_WORKAROUND_MSVC_249830
268 #define RANGES_WORKAROUND_MSVC_677925
270 #define RANGES_WORKAROUND_MSVC_683388
272 #define RANGES_WORKAROUND_MSVC_688606
274 #define RANGES_WORKAROUND_MSVC_786312
275 #define RANGES_WORKAROUND_MSVC_792338
277 #define RANGES_WORKAROUND_MSVC_835948
279 #define RANGES_WORKAROUND_MSVC_934264
281 #if _MSVC_LANG <= 201703L
282 #define RANGES_WORKAROUND_MSVC_OLD_LAMBDA
285 #if _MSVC_LANG <= 201703L
286 #define RANGES_WORKAROUND_MSVC_UNUSABLE_SPAN
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")
344 #define RANGES_WORKAROUND_CWG_1554
346 #if __clang_major__ < 4
347 #define RANGES_WORKAROUND_CLANG_23135
350 #if (__clang_major__ >= 7 && __clang_major__ <= 9) || defined(__apple_build_version__)
351 #define RANGES_WORKAROUND_CLANG_43400
355 #define RANGES_WORKAROUND_GCC_UNFILED0
357 #if __GNUC__ == 7 || __GNUC__ == 8
358 #define RANGES_WORKAROUND_GCC_91525
361 #if __GNUC__ == 9 && __GNUC_MINOR__ < 3 && __cplusplus == RANGES_CXX_STD_17
362 #define RANGES_WORKAROUND_GCC_91923
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
399 #ifndef RANGES_CXX_VER
400 #define RANGES_CXX_VER __cplusplus
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)
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)
413 #define RANGES_CXX_STD RANGES_CXX_STD_11
414 #define RANGES_CXX_FEATURE(x) RANGES_CXX_FEATURE_CONCAT(x, 11)
417 #ifndef RANGES_CXX_STATIC_ASSERT
418 #ifdef __cpp_static_assert
419 #define RANGES_CXX_STATIC_ASSERT __cpp_static_assert
421 #define RANGES_CXX_STATIC_ASSERT RANGES_CXX_FEATURE(STATIC_ASSERT)
425 #ifndef RANGES_CXX_VARIABLE_TEMPLATES
426 #ifdef __cpp_variable_templates
427 #define RANGES_CXX_VARIABLE_TEMPLATES __cpp_variable_templates
429 #define RANGES_CXX_VARIABLE_TEMPLATES RANGES_CXX_FEATURE(VARIABLE_TEMPLATES)
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
438 #define RANGES_CXX_TRAIT_VARIABLE_TEMPLATES 0
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
447 #define RANGES_CXX_ATTRIBUTE_DEPRECATED RANGES_CXX_FEATURE(ATTRIBUTE_DEPRECATED)
451 #ifndef RANGES_CXX_CONSTEXPR
452 #ifdef __cpp_constexpr
453 #define RANGES_CXX_CONSTEXPR __cpp_constexpr
455 #define RANGES_CXX_CONSTEXPR RANGES_CXX_FEATURE(CONSTEXPR)
459 #ifndef RANGES_CXX_RANGE_BASED_FOR
460 #ifdef __cpp_range_based_for
461 #define RANGES_CXX_RANGE_BASED_FOR __cpp_range_based_for
463 #define RANGES_CXX_RANGE_BASED_FOR RANGES_CXX_FEATURE(RANGE_BASED_FOR)
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
472 #define RANGES_CXX_LIB_IS_FINAL RANGES_CXX_FEATURE(LIB_IS_FINAL)
476 #ifndef RANGES_CXX_RETURN_TYPE_DEDUCTION
477 #ifdef __cpp_return_type_deduction
478 #define RANGES_CXX_RETURN_TYPE_DEDUCTION __cpp_return_type_deduction
480 #define RANGES_CXX_RETURN_TYPE_DEDUCTION RANGES_CXX_FEATURE(RETURN_TYPE_DEDUCTION)
484 #ifndef RANGES_CXX_GENERIC_LAMBDAS
485 #ifdef __cpp_generic_lambdas
486 #define RANGES_CXX_GENERIC_LAMBDAS __cpp_generic_lambdas
488 #define RANGES_CXX_GENERIC_LAMBDAS RANGES_CXX_FEATURE(GENERIC_LAMBDAS)
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__)))
498 #define RANGES_CXX_THREAD_LOCAL RANGES_CXX_THREAD_LOCAL_PRE_STANDARD
500 #define RANGES_CXX_THREAD_LOCAL RANGES_CXX_FEATURE(THREAD_LOCAL)
504 #if !defined(RANGES_DEPRECATED) && !defined(RANGES_DISABLE_DEPRECATED_WARNINGS)
505 #if defined(__GNUC__) && !defined(__clang__)
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)))
515 #ifndef RANGES_DEPRECATED
516 #define RANGES_DEPRECATED(MSG)
519 #if !defined(RANGES_DEPRECATED_HEADER) && !defined(RANGES_DISABLE_DEPRECATED_WARNINGS)
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))
529 #define RANGES_DEPRECATED_HEADER(MSG)
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
547 #ifndef RANGES_CXX_COROUTINES
548 #define RANGES_CXX_COROUTINES RANGES_CXX_FEATURE(COROUTINES)
553 #define RANGES_NDEBUG_CONSTEXPR constexpr
555 #define RANGES_NDEBUG_CONSTEXPR inline
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
565 #define RANGES_CXX_INLINE_VARIABLES RANGES_CXX_INLINE_VARIABLES_17
567 #define RANGES_CXX_INLINE_VARIABLES RANGES_CXX_FEATURE(INLINE_VARIABLES)
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) \
577 constexpr auto & name = ::ranges::static_const<type>::value; \
580 #define RANGES_INLINE_VAR inline
581 #define RANGES_INLINE_VARIABLE(type, name) \
582 inline constexpr type name{}; \
586 #if defined(RANGES_DOXYGEN_INVOKED)
587 #define RANGES_DEFINE_CPO(type, name) \
588 inline constexpr type name{}; \
590 #elif RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17
591 #define RANGES_DEFINE_CPO(type, name) \
594 constexpr auto & name = ::ranges::static_const<type>::value; \
598 #define RANGES_DEFINE_CPO(type, name) \
601 inline constexpr type name{}; \
607 #ifndef RANGES_DOXYGEN_INVOKED
608 #define RANGES_HIDDEN_DETAIL(...) __VA_ARGS__
610 #define RANGES_HIDDEN_DETAIL(...)
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) \
621 using RANGES_ADL_BARRIER_FOR(S)::S; \
622 struct RANGES_ADL_BARRIER_FOR(S)::S
624 #define RANGES_ADL_BARRIER_FOR(S)
625 #define RANGES_STRUCT_WITH_ADL_BARRIER(S) S
628 #ifndef RANGES_DOXYGEN_INVOKED
629 #define RANGES_FUNC_BEGIN(NAME) \
632 #define RANGES_FUNC_END(NAME) \
635 RANGES_INLINE_VARIABLE(NAME##_fn, NAME)
636 #define RANGES_FUNC(NAME) operator() RANGES_FUNC_CONST_
637 #define RANGES_FUNC_CONST_(...) (__VA_ARGS__) const
639 #define RANGES_FUNC_BEGIN(NAME)
640 #define RANGES_FUNC_END(NAME)
641 #define RANGES_FUNC(NAME) NAME
644 #ifndef RANGES_CXX_DEDUCTION_GUIDES
645 #if defined(__clang__) && defined(__apple_build_version__)
647 #define RANGES_CXX_DEDUCTION_GUIDES 0
648 #elif defined(__cpp_deduction_guides)
649 #define RANGES_CXX_DEDUCTION_GUIDES __cpp_deduction_guides
651 #define RANGES_CXX_DEDUCTION_GUIDES RANGES_CXX_FEATURE(DEDUCTION_GUIDES)
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_(?)
662 #define RANGES_CXX_VA_OPT 0
666 #ifndef RANGES_CXX_IF_CONSTEXPR
667 #ifdef __cpp_if_constexpr
668 #define RANGES_CXX_IF_CONSTEXPR __cpp_if_constexpr
670 #define RANGES_CXX_IF_CONSTEXPR RANGES_CXX_FEATURE(IF_CONSTEXPR)
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
682 #define RANGES_CXX_ALIGNED_NEW RANGES_CXX_FEATURE(ALIGNED_NEW)
685 #define RANGES_CXX_ALIGNED_NEW 0L
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__>
696 #define RANGES_IS_SAME(...) std::is_same<__VA_ARGS__>::value
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]]
704 #define RANGES_NO_UNIQUE_ADDRESS
707 #if defined(__clang__)
708 #if __has_attribute(no_sanitize)
709 #define RANGES_INTENDED_MODULAR_ARITHMETIC \
710 __attribute__((__no_sanitize__("unsigned-integer-overflow")))
712 #define RANGES_INTENDED_MODULAR_ARITHMETIC
715 #define RANGES_INTENDED_MODULAR_ARITHMETIC
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__
723 #define RANGES_CONSTEXPR_IF(...) __VA_ARGS__
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
731 #ifndef RANGES_BROKEN_CPO_LOOKUP
732 #define RANGES_BROKEN_CPO_LOOKUP 0
735 #ifndef RANGES_NODISCARD
736 #if defined(__has_cpp_attribute) && __has_cpp_attribute(nodiscard)
737 #if defined(__clang__) && __cplusplus < 201703L
739 #define RANGES_NODISCARD \
740 RANGES_DIAGNOSTIC_PUSH \
741 RANGES_DIAGNOSTIC_IGNORE("-Wc++1z-extensions") \
742 [[nodiscard]] RANGES_DIAGNOSTIC_POP
744 #define RANGES_NODISCARD [[nodiscard]]
747 #define RANGES_NODISCARD
751 #ifndef RANGES_EMPTY_BASES
753 #define RANGES_EMPTY_BASES __declspec(empty_bases)
755 #define RANGES_EMPTY_BASES