#pragma once #include namespace stdx { inline namespace v1 { #if __cplusplus < 202002L // NOLINTBEGIN(bugprone-macro-parentheses, cppcoreguidelines-macro-usage) #define DETECTOR(name, expr) \ namespace detail::detect { \ template constexpr auto name = false; \ template \ constexpr auto name> = true; \ } // NOLINTEND(bugprone-macro-parentheses, cppcoreguidelines-macro-usage) DETECTOR(range_begin, (std::begin(std::declval()))) DETECTOR(range_end, (std::end(std::declval()))) template constexpr auto range = detail::detect::range_begin and detail::detect::range_end; #undef DETECTOR #else template concept range = requires(T &t) { std::begin(t); std::end(t); }; #endif } // namespace v1 } // namespace stdx