Loading...
Searching...
No Matches
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