@@ -38,6 +38,40 @@ namespace stdsharp
38
38
iter_const_reference_t <std::ranges::iterator_t <T>>;
39
39
#endif
40
40
41
+ #define STDSHARP_MD_RANGE_TRAITS (name, ns ) \
42
+ template <std::size_t N, typename T> \
43
+ struct md_ ##name \
44
+ { \
45
+ using rng = T; \
46
+ \
47
+ using type = ns::name##_t<typename md_##name<N - 1 , T>::type>; \
48
+ }; \
49
+ \
50
+ template <typename T> \
51
+ struct md_ ##name<0 , T> \
52
+ { \
53
+ using rng = T; \
54
+ \
55
+ using type = ns::name##_t<T>; \
56
+ }; \
57
+ \
58
+ template <std::size_t N, typename T> \
59
+ using md_##name##_t = typename md_##name<N, T>::type;
60
+
61
+ STDSHARP_MD_RANGE_TRAITS (iterator, std::ranges)
62
+ STDSHARP_MD_RANGE_TRAITS (const_iterator, stdsharp)
63
+ STDSHARP_MD_RANGE_TRAITS (sentinel, std::ranges)
64
+ STDSHARP_MD_RANGE_TRAITS (const_sentinel, stdsharp)
65
+ STDSHARP_MD_RANGE_TRAITS (range_size, std::ranges)
66
+ STDSHARP_MD_RANGE_TRAITS (range_difference, std::ranges)
67
+ STDSHARP_MD_RANGE_TRAITS (range_value, std::ranges)
68
+ STDSHARP_MD_RANGE_TRAITS (range_reference, std::ranges)
69
+ STDSHARP_MD_RANGE_TRAITS (range_const_reference, stdsharp)
70
+ STDSHARP_MD_RANGE_TRAITS (range_rvalue_reference, std::ranges)
71
+ STDSHARP_MD_RANGE_TRAITS (range_common_reference, std::ranges)
72
+
73
+ #undef STDSHARP_MD_RANGE_TRAITS
74
+
41
75
template <typename T>
42
76
using forwarding_view = std::ranges::transform_view<T, forward_like_fn<T>>;
43
77
@@ -66,15 +100,6 @@ namespace stdsharp
66
100
std::ranges::output_range<Out, std::ranges::range_reference_t <Out>> &&
67
101
std::indirectly_copyable<std::ranges::iterator_t <In>, std::ranges::iterator_t <Out>>;
68
102
69
- namespace views
70
- {
71
- template <typename T>
72
- inline constexpr auto forwarding = std::ranges::views::transform(forward_like<T>);
73
-
74
- template <typename U>
75
- inline constexpr auto cast = std::ranges::views::transform(cast_to<U>);
76
- }
77
-
78
103
inline constexpr struct is_iter_in_fn
79
104
{
80
105
template <typename In, std::sentinel_for<In> Sentinel>
@@ -95,4 +120,23 @@ namespace stdsharp
95
120
return (*this )(std::ranges::cbegin (r), std::ranges::cend (r), in);
96
121
}
97
122
} is_iter_in{};
123
+
124
+ inline constexpr struct index_fn
125
+ {
126
+ template <typename R>
127
+ requires std::invocable<::ranges::index_fn, R, std::ranges::range_size_t <R>>
128
+ constexpr decltype (auto ) operator()(R&& r, const std::ranges::range_size_t <R>& i) const
129
+ {
130
+ return ::ranges::index (r, i);
131
+ }
132
+ } index{};
133
+ }
134
+
135
+ namespace stdsharp ::views
136
+ {
137
+ template <typename T>
138
+ inline constexpr auto forwarding = std::ranges::views::transform(forward_like<T>);
139
+
140
+ template <typename U>
141
+ inline constexpr auto cast = std::ranges::views::transform(cast_to<U>);
98
142
}
0 commit comments