Skip to content

Commit 818900b

Browse files
committed
feat(ranges): add multi-dimension range traits
BREAKING CHANGE: remove duplicate concepts Closes #21
1 parent 1d87526 commit 818900b

File tree

3 files changed

+56
-21
lines changed

3 files changed

+56
-21
lines changed

include/stdsharp/concepts/concepts.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,9 @@ namespace stdsharp
5959
template<typename T>
6060
concept arithmetic = std::is_arithmetic_v<T>;
6161

62-
template<typename T>
63-
concept signed_ = std::is_signed_v<T>;
64-
6562
template<typename T>
6663
concept empty_type = std::is_empty_v<T>;
6764

68-
template<typename T>
69-
concept unsigned_ = std::is_unsigned_v<T>;
70-
71-
template<typename T>
72-
concept floating_point = std::is_floating_point_v<T>;
73-
7465
template<typename T, typename U = T>
7566
concept arithmetic_like = std::three_way_comparable<T> && requires(T t1, U t2) {
7667
{
@@ -136,7 +127,7 @@ namespace stdsharp
136127
};
137128

138129
template<typename T>
139-
concept fundamental_array = std::is_array_v<T>;
130+
concept carray = std::is_array_v<T>;
140131

141132
template<typename T, typename U>
142133
concept base_of = std::is_base_of_v<T, U>;

include/stdsharp/functional/operations.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ namespace stdsharp
205205
{
206206
struct advance_by_op
207207
{
208-
template<typename T, unsigned_ Distance = std::iter_difference_t<T>>
208+
template<typename T, std::unsigned_integral Distance = std::iter_difference_t<T>>
209209
requires std::invocable<pre_increase, T>
210210
constexpr decltype(auto) operator()(T & v, Distance distance) const
211211
noexcept(nothrow_invocable<pre_increase, T>)
@@ -215,7 +215,7 @@ namespace stdsharp
215215
return v;
216216
}
217217

218-
template<typename T, signed_ Distance = std::iter_difference_t<T>>
218+
template<typename T, std::signed_integral Distance = std::iter_difference_t<T>>
219219
requires(
220220
std::invocable<advance_by_op, T, std::make_unsigned_t<Distance>> &&
221221
std::invocable<pre_decrease, T> //

include/stdsharp/ranges/ranges.h

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,40 @@ namespace stdsharp
3838
iter_const_reference_t<std::ranges::iterator_t<T>>;
3939
#endif
4040

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+
4175
template<typename T>
4276
using forwarding_view = std::ranges::transform_view<T, forward_like_fn<T>>;
4377

@@ -66,15 +100,6 @@ namespace stdsharp
66100
std::ranges::output_range<Out, std::ranges::range_reference_t<Out>> &&
67101
std::indirectly_copyable<std::ranges::iterator_t<In>, std::ranges::iterator_t<Out>>;
68102

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-
78103
inline constexpr struct is_iter_in_fn
79104
{
80105
template<typename In, std::sentinel_for<In> Sentinel>
@@ -95,4 +120,23 @@ namespace stdsharp
95120
return (*this)(std::ranges::cbegin(r), std::ranges::cend(r), in);
96121
}
97122
} 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>);
98142
}

0 commit comments

Comments
 (0)