13
13
14
14
#include < ranges>
15
15
#include < cassert>
16
+ #include < utility>
16
17
18
+ #include " __ranges/concepts.h"
17
19
#include " test_macros.h"
18
20
#include " test_iterators.h"
19
21
#include " test_range.h"
@@ -30,8 +32,12 @@ static_assert(!std::ranges::sized_range<const NonCommonSimpleView>);
30
32
constexpr bool test () {
31
33
int buffer[8 ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
32
34
33
- // sized_range && random_access_iterator
35
+ // simple-view<V> && sized_range<V> && random_access_range<V>
34
36
{
37
+ static_assert (simple_view<SizedRandomAccessView>);
38
+ static_assert (std::ranges::sized_range<SizedRandomAccessView>);
39
+ static_assert (std::ranges::random_access_range<SizedRandomAccessView>);
40
+
35
41
std::ranges::take_view<SizedRandomAccessView> tv (SizedRandomAccessView (buffer), 4 );
36
42
assert (tv.begin () == SizedRandomAccessView (buffer).begin ());
37
43
ASSERT_SAME_TYPE (decltype (tv.begin ()), RandomAccessIter);
@@ -43,10 +49,14 @@ constexpr bool test() {
43
49
ASSERT_SAME_TYPE (decltype (tv.begin ()), RandomAccessIter);
44
50
}
45
51
46
- // sized_range && !random_access_iterator
52
+ // simple-view<V> && sized_range<V> && !random_access_range<V>
47
53
{
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)
50
60
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<ForwardIter>);
51
61
}
52
62
@@ -56,8 +66,10 @@ constexpr bool test() {
56
66
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<ForwardIter>);
57
67
}
58
68
59
- // !sized_range
69
+ // simple-view<V> && !sized_range<V>
60
70
{
71
+ static_assert (simple_view<MoveOnlyView>);
72
+ static_assert (simple_view<MoveOnlyView>);
61
73
std::ranges::take_view<MoveOnlyView> tv (MoveOnlyView{buffer}, 4 );
62
74
assert (tv.begin () == std::counted_iterator<int *>(buffer, 4 ));
63
75
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<int *>);
@@ -69,13 +81,51 @@ constexpr bool test() {
69
81
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<int *>);
70
82
}
71
83
72
- // simple-view<V> && sized_range<V> && !size_range<! V>
84
+ // simple-view<V> && sized_range<V> && !sized_range<const V>
73
85
{
86
+ static_assert (simple_view<NonCommonSimpleView>);
87
+ static_assert (std::ranges::sized_range<NonCommonSimpleView>);
88
+ static_assert (!std::ranges::sized_range<const NonCommonSimpleView>);
89
+
74
90
std::ranges::take_view<NonCommonSimpleView> tv{};
75
91
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<int *>);
76
92
ASSERT_SAME_TYPE (decltype (std::as_const (tv).begin ()), std::counted_iterator<int *>);
77
93
}
78
94
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
+ }
79
129
return true ;
80
130
}
81
131
0 commit comments