Skip to content

Commit 6f788c1

Browse files
committed
fixup! [libc++][NFC] Check for take_view returning different types depending on simple_view-ness
Finish adding tests.
1 parent df218fc commit 6f788c1

File tree

3 files changed

+87
-20
lines changed

3 files changed

+87
-20
lines changed

libcxx/test/std/ranges/range.adaptors/range.take/begin.pass.cpp

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

1414
#include <ranges>
1515
#include <cassert>
16+
#include <utility>
1617

18+
#include "__ranges/concepts.h"
1719
#include "test_macros.h"
1820
#include "test_iterators.h"
1921
#include "test_range.h"
@@ -30,8 +32,12 @@ static_assert(!std::ranges::sized_range<const NonCommonSimpleView>);
3032
constexpr bool test() {
3133
int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
3234

33-
// sized_range && random_access_iterator
35+
// simple-view<V> && sized_range<V> && random_access_range<V>
3436
{
37+
static_assert(simple_view<SizedRandomAccessView>);
38+
static_assert(std::ranges::sized_range<SizedRandomAccessView>);
39+
static_assert(std::ranges::random_access_range<SizedRandomAccessView>);
40+
3541
std::ranges::take_view<SizedRandomAccessView> tv(SizedRandomAccessView(buffer), 4);
3642
assert(tv.begin() == SizedRandomAccessView(buffer).begin());
3743
ASSERT_SAME_TYPE(decltype(tv.begin()), RandomAccessIter);
@@ -43,10 +49,14 @@ constexpr bool test() {
4349
ASSERT_SAME_TYPE(decltype(tv.begin()), RandomAccessIter);
4450
}
4551

46-
// sized_range && !random_access_iterator
52+
// simple-view<V> && sized_range<V> && !random_access_range<V>
4753
{
48-
std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 4);
49-
assert(tv.begin() == std::counted_iterator<ForwardIter>(ForwardIter(buffer), 4));
54+
static_assert(simple_view<SizedForwardView>);
55+
static_assert(std::ranges::sized_range<SizedForwardView>);
56+
static_assert(!std::ranges::random_access_range<SizedForwardView>);
57+
58+
std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 16); // underlying size is 8
59+
assert(tv.begin() == std::counted_iterator<ForwardIter>(ForwardIter(buffer), 8)); // expect min(8, 16)
5060
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<ForwardIter>);
5161
}
5262

@@ -56,8 +66,10 @@ constexpr bool test() {
5666
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<ForwardIter>);
5767
}
5868

59-
// !sized_range
69+
// simple-view<V> && !sized_range<V>
6070
{
71+
static_assert(simple_view<MoveOnlyView>);
72+
static_assert(simple_view<MoveOnlyView>);
6173
std::ranges::take_view<MoveOnlyView> tv(MoveOnlyView{buffer}, 4);
6274
assert(tv.begin() == std::counted_iterator<int*>(buffer, 4));
6375
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<int*>);
@@ -69,13 +81,51 @@ constexpr bool test() {
6981
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<int*>);
7082
}
7183

72-
// simple-view<V> && sized_range<V> && !size_range<!V>
84+
// simple-view<V> && sized_range<V> && !sized_range<const V>
7385
{
86+
static_assert(simple_view<NonCommonSimpleView>);
87+
static_assert(std::ranges::sized_range<NonCommonSimpleView>);
88+
static_assert(!std::ranges::sized_range<const NonCommonSimpleView>);
89+
7490
std::ranges::take_view<NonCommonSimpleView> tv{};
7591
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<int*>);
7692
ASSERT_SAME_TYPE(decltype(std::as_const(tv).begin()), std::counted_iterator<int*>);
7793
}
7894

95+
// non simple-view<V> && !sized_range<V>
96+
{
97+
static_assert(!simple_view<NonSimpleNonSizedView>);
98+
static_assert(!std::ranges::sized_range<NonSimpleNonSizedView>);
99+
100+
std::ranges::take_view<NonSimpleNonSizedView> tv{NonSimpleNonSizedView{buffer, buffer + 2}, 4};
101+
// The count for the counted iterator is the count of the take_view (i.e., 4)
102+
assert(tv.begin() ==
103+
std::counted_iterator<common_input_iterator<const int*>>(common_input_iterator<const int*>(buffer), 4));
104+
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<common_input_iterator<const int*>>);
105+
}
106+
107+
// non simple-view<V> && sized_range<V>
108+
{
109+
static_assert(!simple_view<NonSimpleSizedView>);
110+
static_assert(std::ranges::sized_range<NonSimpleSizedView>);
111+
112+
std::ranges::take_view<NonSimpleSizedView> tv{NonSimpleSizedView{buffer, buffer + 2}, 4};
113+
// The count for the counted iterator is the min(2, 4) (i.e., 2).
114+
assert(tv.begin() ==
115+
std::counted_iterator<common_input_iterator<const int*>>(common_input_iterator<const int*>(buffer), 2));
116+
ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<common_input_iterator<const int*>>);
117+
}
118+
119+
// non simple-view<V> && sized_range<V> && random_access_range<V>
120+
{
121+
static_assert(!simple_view<NonSimpleSizedRandomView>);
122+
static_assert(std::ranges::sized_range<NonSimpleSizedRandomView>);
123+
static_assert(std::ranges::random_access_range<NonSimpleSizedRandomView>);
124+
125+
std::ranges::take_view<NonSimpleSizedRandomView> tv{NonSimpleSizedRandomView{buffer, buffer + 2}, 4};
126+
assert(tv.begin() == random_access_iterator<const int*>(buffer));
127+
ASSERT_SAME_TYPE(decltype(tv.begin()), random_access_iterator<const int*>);
128+
}
79129
return true;
80130
}
81131

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ constexpr bool test() {
7272
{
7373
// __iterator<false> has base with type std::ranges::sentinel_t<NonSimpleViewNonSized>; adding a const qualifier
7474
// would change the equality.
75-
std::ranges::take_view<NonSimpleViewNonSized> tvns(NonSimpleViewNonSized{buffer, buffer + 8}, 0);
76-
static_assert(!std::is_same_v<decltype(tvns.end().base()), std::ranges::sentinel_t<const NonSimpleViewNonSized>>);
75+
std::ranges::take_view<NonSimpleNonSizedView> tvns(NonSimpleNonSizedView{buffer, buffer + 8}, 0);
76+
static_assert(!std::is_same_v<decltype(tvns.end().base()), std::ranges::sentinel_t<const NonSimpleNonSizedView>>);
7777
}
7878

7979
{

libcxx/test/std/ranges/range.adaptors/range.take/types.h

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,37 +65,54 @@ struct View : std::ranges::view_base {
6565
int* end_;
6666
};
6767

68-
template <bool Simple>
68+
template <template <class ...> typename Iter, bool Simple, bool Sized>
6969
struct CommonInputView : std::ranges::view_base {
7070
constexpr explicit CommonInputView(int* b, int* e) : begin_(b), end_(e) {}
7171

72-
constexpr common_input_iterator<int*> begin() const { return common_input_iterator<int*>(begin_); }
73-
constexpr common_input_iterator<int*> end() const { return common_input_iterator<int*>(end_); }
72+
constexpr Iter<int*> begin() const { return Iter<int*>(begin_); }
73+
constexpr Iter<int*> end() const { return Iter<int*>(end_); }
7474

75-
constexpr common_input_iterator<const int*> begin()
75+
constexpr Iter<const int*> begin()
7676
requires(!Simple)
7777
{
78-
return common_input_iterator<const int*>(begin_);
78+
return Iter<const int*>(begin_);
7979
}
80-
constexpr common_input_iterator<const int*> end()
80+
constexpr Iter<const int*> end()
8181
requires(!Simple)
8282
{
83-
return common_input_iterator<const int*>(end_);
83+
return Iter<const int*>(end_);
84+
}
85+
86+
constexpr auto size() const
87+
requires Sized
88+
{
89+
return end_ - begin_;
8490
}
8591

8692
private:
8793
int* begin_;
8894
int* end_;
8995
};
9096

91-
using NonSimpleViewNonSized = CommonInputView<false>;
92-
static_assert(std::ranges::view<NonSimpleViewNonSized>);
93-
static_assert(!simple_view<NonSimpleViewNonSized>);
94-
static_assert(!std::ranges::sized_range<NonSimpleViewNonSized>);
97+
using NonSimpleNonSizedView = CommonInputView<common_input_iterator,false, false>;
98+
static_assert(std::ranges::view<NonSimpleNonSizedView>);
99+
static_assert(!simple_view<NonSimpleNonSizedView>);
100+
static_assert(!std::ranges::sized_range<NonSimpleNonSizedView>);
95101

96-
using SimpleViewNonSized = CommonInputView<true>;
102+
using SimpleViewNonSized = CommonInputView<common_input_iterator,true, false>;
97103
static_assert(std::ranges::view<SimpleViewNonSized>);
98104
static_assert(simple_view<SimpleViewNonSized>);
99105
static_assert(!std::ranges::sized_range<SimpleViewNonSized>);
100106

107+
using NonSimpleSizedView = CommonInputView<common_input_iterator,false, true>;
108+
static_assert(std::ranges::view<NonSimpleSizedView>);
109+
static_assert(!simple_view<NonSimpleSizedView>);
110+
static_assert(std::ranges::sized_range<NonSimpleSizedView>);
111+
112+
using NonSimpleSizedRandomView = CommonInputView<random_access_iterator,false, true>;
113+
static_assert(std::ranges::view<NonSimpleSizedRandomView>);
114+
static_assert(!simple_view<NonSimpleSizedRandomView>);
115+
static_assert(std::ranges::sized_range<NonSimpleSizedRandomView>);
116+
static_assert(std::ranges::random_access_range<NonSimpleSizedRandomView>);
117+
101118
#endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_TAKE_TYPES_H

0 commit comments

Comments
 (0)