34#if KCENON_HAS_INCLUDE(<version>)
53#ifndef KCENON_HAS_SOURCE_LOCATION
54 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<source_location>)
55 #if defined(__cpp_lib_source_location) && __cpp_lib_source_location >= 201907L
56 #define KCENON_HAS_SOURCE_LOCATION 1
59 #ifndef KCENON_HAS_SOURCE_LOCATION
60 #define KCENON_HAS_SOURCE_LOCATION 0
82#ifndef KCENON_HAS_JTHREAD
85 #if defined(__cpp_lib_jthread) && __cpp_lib_jthread >= 201911L
86 #define KCENON_HAS_JTHREAD 1
88 #elif defined(__cpp_lib_stop_token) && __cpp_lib_stop_token >= 201907L
89 #define KCENON_HAS_JTHREAD 1
92 #ifndef KCENON_HAS_JTHREAD
93 #define KCENON_HAS_JTHREAD 0
100#ifndef KCENON_HAS_STOP_TOKEN
102 #if defined(__cpp_lib_stop_token) && __cpp_lib_stop_token >= 201907L
103 #define KCENON_HAS_STOP_TOKEN 1
106 #ifndef KCENON_HAS_STOP_TOKEN
107 #define KCENON_HAS_STOP_TOKEN 0
121#ifndef KCENON_HAS_FORMAT
122 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<format>)
123 #if defined(__cpp_lib_format) && __cpp_lib_format >= 201907L
124 #define KCENON_HAS_FORMAT 1
127 #ifndef KCENON_HAS_FORMAT
128 #define KCENON_HAS_FORMAT 0
141#ifndef KCENON_HAS_SPAN
142 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<span>)
143 #if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L
144 #define KCENON_HAS_SPAN 1
147 #ifndef KCENON_HAS_SPAN
148 #define KCENON_HAS_SPAN 0
161#ifndef KCENON_HAS_RANGES
162 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<ranges>)
163 #if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L
164 #define KCENON_HAS_RANGES 1
167 #ifndef KCENON_HAS_RANGES
168 #define KCENON_HAS_RANGES 0
182#ifndef KCENON_HAS_EXPECTED
183 #if KCENON_HAS_CPP23 && KCENON_HAS_INCLUDE(<expected>)
184 #if defined(__cpp_lib_expected) && __cpp_lib_expected >= 202202L
185 #define KCENON_HAS_EXPECTED 1
188 #ifndef KCENON_HAS_EXPECTED
189 #define KCENON_HAS_EXPECTED 0
202#ifndef KCENON_HAS_STACKTRACE
203 #if KCENON_HAS_CPP23 && KCENON_HAS_INCLUDE(<stacktrace>)
204 #if defined(__cpp_lib_stacktrace) && __cpp_lib_stacktrace >= 202011L
205 #define KCENON_HAS_STACKTRACE 1
208 #ifndef KCENON_HAS_STACKTRACE
209 #define KCENON_HAS_STACKTRACE 0
220#ifndef KCENON_HAS_CONCEPTS
221 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<concepts>)
222 #if defined(__cpp_concepts) && __cpp_concepts >= 201907L
223 #define KCENON_HAS_CONCEPTS 1
226 #ifndef KCENON_HAS_CONCEPTS
227 #define KCENON_HAS_CONCEPTS 0
238#ifndef KCENON_HAS_COROUTINES
239 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<coroutine>)
240 #if defined(__cpp_impl_coroutine) && __cpp_impl_coroutine >= 201902L
241 #define KCENON_HAS_COROUTINES 1
244 #ifndef KCENON_HAS_COROUTINES
245 #define KCENON_HAS_COROUTINES 0
256#ifndef KCENON_HAS_THREE_WAY_COMPARISON
257 #if KCENON_HAS_CPP20 && KCENON_HAS_INCLUDE(<compare>)
258 #if defined(__cpp_impl_three_way_comparison) && \
259 __cpp_impl_three_way_comparison >= 201907L
260 #define KCENON_HAS_THREE_WAY_COMPARISON 1
263 #ifndef KCENON_HAS_THREE_WAY_COMPARISON
264 #define KCENON_HAS_THREE_WAY_COMPARISON 0
275#ifndef KCENON_HAS_OPTIONAL_MONADIC
277 #if defined(__cpp_lib_optional) && __cpp_lib_optional >= 202110L
278 #define KCENON_HAS_OPTIONAL_MONADIC 1
281 #ifndef KCENON_HAS_OPTIONAL_MONADIC
282 #define KCENON_HAS_OPTIONAL_MONADIC 0
293#ifndef KCENON_HAS_CONSTEXPR_VECTOR
295 #if defined(__cpp_lib_constexpr_vector) && \
296 __cpp_lib_constexpr_vector >= 201907L
297 #define KCENON_HAS_CONSTEXPR_VECTOR 1
300 #ifndef KCENON_HAS_CONSTEXPR_VECTOR
301 #define KCENON_HAS_CONSTEXPR_VECTOR 0
308#ifndef KCENON_HAS_CONSTEXPR_STRING
310 #if defined(__cpp_lib_constexpr_string) && \
311 __cpp_lib_constexpr_string >= 201907L
312 #define KCENON_HAS_CONSTEXPR_STRING 1
315 #ifndef KCENON_HAS_CONSTEXPR_STRING
316 #define KCENON_HAS_CONSTEXPR_STRING 0
Core KCENON_* macro definitions for feature detection.