Skip to content

Commit 52426b9

Browse files
committed
review
1 parent 1db94f9 commit 52426b9

File tree

7 files changed

+85
-34
lines changed

7 files changed

+85
-34
lines changed

libcxx/include/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,6 @@ set(files
744744
__ranges/view_interface.h
745745
__ranges/views.h
746746
__ranges/zip_transform_view.h
747-
__ranges/zip_utils.h
748747
__ranges/zip_view.h
749748
__split_buffer
750749
__std_mbstate_t.h
@@ -790,6 +789,7 @@ set(files
790789
__tuple/tuple_like.h
791790
__tuple/tuple_like_no_subrange.h
792791
__tuple/tuple_size.h
792+
__tuple/tuple_transform.h
793793
__type_traits/add_cv_quals.h
794794
__type_traits/add_pointer.h
795795
__type_traits/add_reference.h

libcxx/include/__ranges/adjacent_view.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
#include <__ranges/range_adaptor.h>
3636
#include <__ranges/size.h>
3737
#include <__ranges/view_interface.h>
38-
#include <__ranges/zip_utils.h>
38+
#include <__tuple/tuple_transform.h>
3939
#include <__type_traits/common_type.h>
4040
#include <__type_traits/is_nothrow_constructible.h>
4141
#include <__type_traits/make_unsigned.h>
@@ -151,7 +151,7 @@ class adjacent_view<_View, _Np>::__iterator {
151151

152152
_LIBCPP_HIDE_FROM_ABI constexpr __iterator(iterator_t<_Base> __first, sentinel_t<_Base> __last) {
153153
__current_[0] = __first;
154-
for (int __i = 1; __i < static_cast<int>(_Np); ++__i) {
154+
for (size_t __i = 1; __i < _Np; ++__i) {
155155
__current_[__i] = ranges::next(__current_[__i - 1], 1, __last);
156156
}
157157
}
@@ -195,7 +195,7 @@ class adjacent_view<_View, _Np>::__iterator {
195195
: __iterator(std::move(__i), make_index_sequence<_Np>{}) {}
196196

197197
_LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const {
198-
return ranges::__tuple_transform([](auto& __i) -> decltype(auto) { return *__i; }, __current_);
198+
return std::__tuple_transform([](auto& __i) -> decltype(auto) { return *__i; }, __current_);
199199
}
200200

201201
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() {
@@ -249,7 +249,7 @@ class adjacent_view<_View, _Np>::__iterator {
249249
_LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __n) const
250250
requires random_access_range<_Base>
251251
{
252-
return ranges::__tuple_transform([&](auto& __i) -> decltype(auto) { return __i[__n]; }, __current_);
252+
return std::__tuple_transform([&](auto& __i) -> decltype(auto) { return __i[__n]; }, __current_);
253253
}
254254

255255
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator& __x, const __iterator& __y) {
@@ -317,7 +317,7 @@ class adjacent_view<_View, _Np>::__iterator {
317317
_LIBCPP_HIDE_FROM_ABI friend constexpr auto iter_move(const __iterator& __i) noexcept(
318318
noexcept(ranges::iter_move(std::declval<const iterator_t<_Base>&>())) &&
319319
is_nothrow_move_constructible_v<range_rvalue_reference_t<_Base>>) {
320-
return ranges::__tuple_transform(ranges::iter_move, __i.__current_);
320+
return std::__tuple_transform(ranges::iter_move, __i.__current_);
321321
}
322322

323323
_LIBCPP_HIDE_FROM_ABI friend constexpr void iter_swap(const __iterator& __l, const __iterator& __r) noexcept(

libcxx/include/__ranges/zip_view.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
//
88
//===----------------------------------------------------------------------===//
99

10-
#ifndef _LIBCPP___RANGES_ZIP_UTILS_H
11-
#define _LIBCPP___RANGES_ZIP_UTILS_H
10+
#ifndef _LIBCPP___RANGES_ZIP_VIEW_H
11+
#define _LIBCPP___RANGES_ZIP_VIEW_H
1212

1313
#include <__config>
1414

@@ -31,7 +31,7 @@
3131
#include <__ranges/enable_borrowed_range.h>
3232
#include <__ranges/size.h>
3333
#include <__ranges/view_interface.h>
34-
#include <__ranges/zip_utils.h>
34+
#include <__tuple/tuple_transform.h>
3535
#include <__type_traits/is_nothrow_constructible.h>
3636
#include <__type_traits/make_unsigned.h>
3737
#include <__utility/declval.h>
@@ -137,36 +137,36 @@ class zip_view : public view_interface<zip_view<_Views...>> {
137137
_LIBCPP_HIDE_FROM_ABI constexpr auto begin()
138138
requires(!(__simple_view<_Views> && ...))
139139
{
140-
return __iterator<false>(ranges::__tuple_transform(ranges::begin, __views_));
140+
return __iterator<false>(std::__tuple_transform(ranges::begin, __views_));
141141
}
142142

143143
_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const
144144
requires(range<const _Views> && ...)
145145
{
146-
return __iterator<true>(ranges::__tuple_transform(ranges::begin, __views_));
146+
return __iterator<true>(std::__tuple_transform(ranges::begin, __views_));
147147
}
148148

149149
_LIBCPP_HIDE_FROM_ABI constexpr auto end()
150150
requires(!(__simple_view<_Views> && ...))
151151
{
152152
if constexpr (!__zip_is_common<_Views...>) {
153-
return __sentinel<false>(ranges::__tuple_transform(ranges::end, __views_));
153+
return __sentinel<false>(std::__tuple_transform(ranges::end, __views_));
154154
} else if constexpr ((random_access_range<_Views> && ...)) {
155155
return begin() + iter_difference_t<__iterator<false>>(size());
156156
} else {
157-
return __iterator<false>(ranges::__tuple_transform(ranges::end, __views_));
157+
return __iterator<false>(std::__tuple_transform(ranges::end, __views_));
158158
}
159159
}
160160

161161
_LIBCPP_HIDE_FROM_ABI constexpr auto end() const
162162
requires(range<const _Views> && ...)
163163
{
164164
if constexpr (!__zip_is_common<const _Views...>) {
165-
return __sentinel<true>(ranges::__tuple_transform(ranges::end, __views_));
165+
return __sentinel<true>(std::__tuple_transform(ranges::end, __views_));
166166
} else if constexpr ((random_access_range<const _Views> && ...)) {
167167
return begin() + iter_difference_t<__iterator<true>>(size());
168168
} else {
169-
return __iterator<true>(ranges::__tuple_transform(ranges::end, __views_));
169+
return __iterator<true>(std::__tuple_transform(ranges::end, __views_));
170170
}
171171
}
172172

@@ -178,7 +178,7 @@ class zip_view : public view_interface<zip_view<_Views...>> {
178178
using _CT = make_unsigned_t<common_type_t<decltype(__sizes)...>>;
179179
return ranges::min({_CT(__sizes)...});
180180
},
181-
ranges::__tuple_transform(ranges::size, __views_));
181+
std::__tuple_transform(ranges::size, __views_));
182182
}
183183

184184
_LIBCPP_HIDE_FROM_ABI constexpr auto size() const
@@ -189,7 +189,7 @@ class zip_view : public view_interface<zip_view<_Views...>> {
189189
using _CT = make_unsigned_t<common_type_t<decltype(__sizes)...>>;
190190
return ranges::min({_CT(__sizes)...});
191191
},
192-
ranges::__tuple_transform(ranges::size, __views_));
192+
std::__tuple_transform(ranges::size, __views_));
193193
}
194194
};
195195

@@ -268,7 +268,7 @@ class zip_view<_Views...>::__iterator : public __zip_view_iterator_category_base
268268
: __current_(std::move(__i.__current_)) {}
269269

270270
_LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const {
271-
return ranges::__tuple_transform([](auto& __i) -> decltype(auto) { return *__i; }, __current_);
271+
return std::__tuple_transform([](auto& __i) -> decltype(auto) { return *__i; }, __current_);
272272
}
273273

274274
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() {
@@ -318,7 +318,7 @@ class zip_view<_Views...>::__iterator : public __zip_view_iterator_category_base
318318
_LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __n) const
319319
requires __zip_all_random_access<_Const, _Views...>
320320
{
321-
return ranges::__tuple_transform(
321+
return std::__tuple_transform(
322322
[&]<class _Iter>(_Iter& __i) -> decltype(auto) { return __i[iter_difference_t<_Iter>(__n)]; }, __current_);
323323
}
324324

@@ -377,7 +377,7 @@ class zip_view<_Views...>::__iterator : public __zip_view_iterator_category_base
377377
_LIBCPP_HIDE_FROM_ABI friend constexpr auto iter_move(const __iterator& __i) noexcept(
378378
(noexcept(ranges::iter_move(std::declval<const iterator_t<__maybe_const<_Const, _Views>>&>())) && ...) &&
379379
(is_nothrow_move_constructible_v<range_rvalue_reference_t<__maybe_const<_Const, _Views>>> && ...)) {
380-
return ranges::__tuple_transform(ranges::iter_move, __i.__current_);
380+
return std::__tuple_transform(ranges::iter_move, __i.__current_);
381381
}
382382

383383
_LIBCPP_HIDE_FROM_ABI friend constexpr void iter_swap(const __iterator& __l, const __iterator& __r) noexcept(
@@ -496,4 +496,4 @@ _LIBCPP_END_NAMESPACE_STD
496496

497497
_LIBCPP_POP_MACROS
498498

499-
#endif // _LIBCPP___RANGES_ZIP_UTILS_H
499+
#endif // _LIBCPP___RANGES_ZIP_VIEW_H
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
//
88
//===----------------------------------------------------------------------===//
99

10-
#ifndef _LIBCPP___RANGES_ZIP_VIEW_H
11-
#define _LIBCPP___RANGES_ZIP_VIEW_H
10+
#ifndef _LIBCPP___TUPLE_TUPLE_TRANSFORM_H
11+
#define _LIBCPP___TUPLE_TUPLE_TRANSFORM_H
1212

1313
#include <__config>
1414

@@ -27,8 +27,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
2727

2828
#if _LIBCPP_STD_VER >= 23
2929

30-
namespace ranges {
31-
3230
template <class _Fun, class _Tuple>
3331
_LIBCPP_HIDE_FROM_ABI constexpr auto __tuple_transform(_Fun&& __f, _Tuple&& __tuple) {
3432
return std::apply(
@@ -38,11 +36,10 @@ _LIBCPP_HIDE_FROM_ABI constexpr auto __tuple_transform(_Fun&& __f, _Tuple&& __tu
3836
std::forward<_Tuple>(__tuple));
3937
}
4038

41-
} // namespace ranges
4239
#endif // _LIBCPP_STD_VER >= 23
4340

4441
_LIBCPP_END_NAMESPACE_STD
4542

4643
_LIBCPP_POP_MACROS
4744

48-
#endif // _LIBCPP___RANGES_ZIP_VIEW_H
45+
#endif // _LIBCPP___TUPLE_TUPLE_TRANSFORM_H

libcxx/include/module.modulemap.in

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,9 +1944,6 @@ module std [system] {
19441944
header "__ranges/zip_view.h"
19451945
export std.utility.pair
19461946
}
1947-
module zip_utils {
1948-
header "__ranges/zip_utils.h"
1949-
}
19501947
module zip_transform_view {
19511948
header "__ranges/zip_transform_view.h"
19521949
}
@@ -2118,6 +2115,7 @@ module std [system] {
21182115
module tuple_like_no_subrange { header "__tuple/tuple_like_no_subrange.h" }
21192116
module tuple_like { header "__tuple/tuple_like.h" }
21202117
module tuple_size { header "__tuple/tuple_size.h" }
2118+
module tuple_trasnform { header "__tuple/tuple_transform.h" }
21212119

21222120
header "tuple"
21232121
export *

libcxx/test/std/ranges/range.adaptors/range.adjacent/end.pass.cpp

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include <array>
1515
#include <cassert>
16+
#include <iterator>
1617
#include <ranges>
1718
#include <type_traits>
1819
#include <utility>
@@ -31,8 +32,10 @@ constexpr void test_one() {
3132
auto cendIt = std::as_const(v).end();
3233
assert(it != endIt);
3334
assert(cit != cendIt);
34-
assert(it + (8 - (N - 1)) == endIt);
35-
assert(cit + (8 - (N - 1)) == cendIt);
35+
std::ranges::advance(it, 8 - (N - 1));
36+
std::ranges::advance(cit, 8 - (N - 1));
37+
assert(it == endIt);
38+
assert(cit == cendIt);
3639
}
3740
{
3841
// empty range
@@ -58,6 +61,37 @@ constexpr void test_one() {
5861
}
5962
}
6063

64+
template <class Underlying, std::size_t N>
65+
constexpr void test_decrement_back() {
66+
int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
67+
std::ranges::adjacent_view<Underlying, N> v{Underlying{buffer}};
68+
auto endIt = v.end();
69+
auto cendIt = std::as_const(v).end();
70+
71+
--endIt;
72+
--cendIt;
73+
auto tuple = *endIt;
74+
auto ctuple = *cendIt;
75+
assert(std::get<0>(tuple) == buffer[8 - N]);
76+
assert(std::get<0>(ctuple) == buffer[8 - N]);
77+
if constexpr (N >= 2) {
78+
assert(std::get<1>(tuple) == buffer[9 - N]);
79+
assert(std::get<1>(ctuple) == buffer[9 - N]);
80+
}
81+
if constexpr (N >= 3) {
82+
assert(std::get<2>(tuple) == buffer[10 - N]);
83+
assert(std::get<2>(ctuple) == buffer[10 - N]);
84+
}
85+
if constexpr (N >= 4) {
86+
assert(std::get<3>(tuple) == buffer[11 - N]);
87+
assert(std::get<3>(ctuple) == buffer[11 - N]);
88+
}
89+
if constexpr (N >= 5) {
90+
assert(std::get<4>(tuple) == buffer[12 - N]);
91+
assert(std::get<4>(ctuple) == buffer[12 - N]);
92+
}
93+
}
94+
6195
template <std::size_t N>
6296
constexpr void test_simple_common_types() {
6397
using NonConstView = std::ranges::adjacent_view<SimpleCommon, N>;
@@ -68,6 +102,7 @@ constexpr void test_simple_common_types() {
68102
static_assert(std::is_same_v<std::ranges::sentinel_t<NonConstView>, std::ranges::sentinel_t<ConstView>>);
69103

70104
test_one<SimpleCommon, N>();
105+
test_decrement_back<SimpleCommon, N>();
71106
}
72107

73108
template <std::size_t N>
@@ -92,6 +127,7 @@ constexpr void test_non_simple_common_types() {
92127
static_assert(!std::is_same_v<std::ranges::sentinel_t<NonConstView>, std::ranges::sentinel_t<ConstView>>);
93128

94129
test_one<NonSimpleCommon, N>();
130+
test_decrement_back<NonSimpleCommon, N>();
95131
}
96132

97133
template <std::size_t N>
@@ -116,6 +152,7 @@ constexpr void test_forward_only() {
116152
static_assert(!std::is_same_v<std::ranges::sentinel_t<NonConstView>, std::ranges::sentinel_t<ConstView>>);
117153

118154
test_one<NonSimpleForwardSizedNonCommon, N>();
155+
test_one<ForwardSizedView, N>();
119156
}
120157

121158
template <std::size_t N>
@@ -124,6 +161,7 @@ constexpr void test() {
124161
test_simple_non_common_types<N>();
125162
test_non_simple_common_types<N>();
126163
test_non_simple_non_common_types<N>();
164+
test_forward_only<N>();
127165
}
128166

129167
constexpr bool test() {

libcxx/test/std/ranges/range.adaptors/range.adjacent/iterator/subscript.pass.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <ranges>
1515
#include <cassert>
1616

17+
#include "../helpers.h"
1718
#include "../../range_adaptor_types.h"
1819

1920
template <std::size_t N>
@@ -26,8 +27,9 @@ constexpr void test() {
2627
auto it = v.begin();
2728
assert(it[0] == *it);
2829
assert(it[2] == *(it + 2));
30+
assert(&std::get<0>(it[2]) == &buffer[2]);
2931

30-
static_assert(std::is_same_v<decltype(it[0]), decltype(*it)>);
32+
static_assert(std::is_same_v<decltype(it[0]), expectedTupleType<N, int&>>);
3133
}
3234

3335
{
@@ -36,8 +38,24 @@ constexpr void test() {
3638
auto it = v.begin();
3739
assert(it[0] == *it);
3840
assert(it[2] == *(it + 2));
41+
assert(&std::get<0>(it[0]) == &buffer[0]);
3942

40-
static_assert(std::is_same_v<decltype(it[0]), decltype(*it)>);
43+
static_assert(std::is_same_v<decltype(it[0]), expectedTupleType<N, int&>>);
44+
}
45+
46+
{
47+
// underlying range with prvalue range_reference_t
48+
auto v = std::views::iota(0, 8) | std::views::adjacent<N>;
49+
std::same_as<expectedTupleType<N, int>> decltype(auto) res = v.begin()[2];
50+
assert(std::get<0>(res) == 2);
51+
if constexpr (N >= 2)
52+
assert(std::get<1>(res) == 3);
53+
if constexpr (N >= 3)
54+
assert(std::get<2>(res) == 4);
55+
if constexpr (N >= 4)
56+
assert(std::get<3>(res) == 5);
57+
if constexpr (N >= 5)
58+
assert(std::get<4>(res) == 6);
4159
}
4260

4361
{

0 commit comments

Comments
 (0)