-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathranges.hpp
More file actions
39 lines (28 loc) · 1.03 KB
/
ranges.hpp
File metadata and controls
39 lines (28 loc) · 1.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once
#include <iterator>
namespace stdx {
inline namespace v1 {
#if __cplusplus < 202002L
// NOLINTBEGIN(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
#define DETECTOR(name, expr) \
namespace detail::detect { \
template <typename T, typename = void> constexpr auto name = false; \
template <typename T> \
constexpr auto name<T, std::void_t<decltype(expr)>> = true; \
}
// NOLINTEND(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
DETECTOR(range_begin, (std::begin(std::declval<T &>())))
DETECTOR(range_end, (std::end(std::declval<T &>())))
template <typename T>
constexpr auto range =
detail::detect::range_begin<T> and detail::detect::range_end<T>;
#undef DETECTOR
#else
template <typename T>
concept range = requires(T &t) {
std::begin(t);
std::end(t);
};
#endif
} // namespace v1
} // namespace stdx