11
11
// constexpr auto begin() requires (!simple-view<V>);
12
12
// constexpr auto begin() const requires range<const V>;
13
13
14
- #include < ranges>
15
14
#include < cassert>
15
+ #include < ranges>
16
+ #include < utility>
16
17
17
18
#include " test_macros.h"
18
19
#include " test_iterators.h"
@@ -27,55 +28,104 @@ struct NonCommonSimpleView : std::ranges::view_base {
27
28
static_assert (std::ranges::sized_range<NonCommonSimpleView>);
28
29
static_assert (!std::ranges::sized_range<const NonCommonSimpleView>);
29
30
31
+ using CommonInputIterPtrConstInt = common_input_iterator<const int *>;
32
+ using CountedCommonInputIterPtrConstInt = std::counted_iterator<CommonInputIterPtrConstInt>;
33
+
30
34
constexpr bool test () {
31
35
int buffer[8 ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
32
36
33
- // sized_range && random_access_iterator
37
+ // simple-view<V> && sized_range<V> && random_access_range<V>
34
38
{
35
- std::ranges::take_view<SizedRandomAccessView> tv ( SizedRandomAccessView (buffer), 4 ) ;
36
- assert (tv. begin () == SizedRandomAccessView (buffer). begin () );
37
- ASSERT_SAME_TYPE ( decltype (tv. begin ()), RandomAccessIter );
38
- }
39
+ using ViewTested = SizedRandomAccessView ;
40
+ static_assert (simple_view<ViewTested> );
41
+ static_assert (std::ranges::sized_range<ViewTested> );
42
+ static_assert (std::ranges::random_access_range<ViewTested>);
39
43
40
- {
41
- const std::ranges::take_view<SizedRandomAccessView> tv (SizedRandomAccessView (buffer), 4 );
42
- assert (tv.begin () == SizedRandomAccessView (buffer).begin ());
44
+ std::ranges::take_view<ViewTested> tv (ViewTested (buffer), 4 );
45
+ assert (tv.begin () == ViewTested (buffer).begin ());
43
46
ASSERT_SAME_TYPE (decltype (tv.begin ()), RandomAccessIter);
44
- }
45
47
46
- // sized_range && !random_access_iterator
47
- {
48
- std::ranges::take_view<SizedForwardView> tv (SizedForwardView{buffer}, 4 );
49
- assert (tv.begin () == std::counted_iterator<ForwardIter>(ForwardIter (buffer), 4 ));
50
- ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<ForwardIter>);
48
+ const std::ranges::take_view<ViewTested> ctv (ViewTested (buffer), 4 );
49
+ assert (ctv.begin () == ViewTested (buffer).begin ());
50
+ ASSERT_SAME_TYPE (decltype (ctv.begin ()), RandomAccessIter);
51
51
}
52
52
53
+ // simple-view<V> && sized_range<V> && !random_access_range<V>
53
54
{
54
- const std::ranges::take_view<SizedForwardView> tv (SizedForwardView{buffer}, 4 );
55
- assert (tv.begin () == std::counted_iterator<ForwardIter>(ForwardIter (buffer), 4 ));
55
+ using ViewTested = SizedForwardView;
56
+ static_assert (simple_view<ViewTested>);
57
+ static_assert (std::ranges::sized_range<ViewTested>);
58
+ static_assert (!std::ranges::random_access_range<ViewTested>);
59
+
60
+ std::ranges::take_view<ViewTested> tv (ViewTested{buffer}, 16 ); // underlying size is 8
61
+ assert (tv.begin () == std::counted_iterator<ForwardIter>(ForwardIter (buffer), 8 )); // expect min(8, 16)
56
62
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<ForwardIter>);
63
+
64
+ const std::ranges::take_view<ViewTested> ctv (ViewTested{buffer}, 4 );
65
+ assert (ctv.begin () == std::counted_iterator<ForwardIter>(ForwardIter (buffer), 4 ));
66
+ ASSERT_SAME_TYPE (decltype (ctv.begin ()), std::counted_iterator<ForwardIter>);
57
67
}
58
68
59
- // !sized_range
69
+ // simple-view<V> && !sized_range<V>
60
70
{
61
- std::ranges::take_view<MoveOnlyView> tv (MoveOnlyView{buffer}, 4 );
71
+ using ViewTested = MoveOnlyView;
72
+ static_assert (simple_view<ViewTested>);
73
+ std::ranges::take_view<ViewTested> tv (ViewTested{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 *>);
76
+
77
+ const std::ranges::take_view<ViewTested> ctv (ViewTested{buffer}, 4 );
78
+ assert (ctv.begin () == std::counted_iterator<int *>(buffer, 4 ));
79
+ ASSERT_SAME_TYPE (decltype (ctv.begin ()), std::counted_iterator<int *>);
64
80
}
65
81
82
+ // simple-view<V> && sized_range<V> && !sized_range<const V>
66
83
{
67
- const std::ranges::take_view<MoveOnlyView> tv (MoveOnlyView{buffer}, 4 );
68
- assert (tv.begin () == std::counted_iterator<int *>(buffer, 4 ));
84
+ using ViewTested = NonCommonSimpleView;
85
+ static_assert (simple_view<ViewTested>);
86
+ static_assert (std::ranges::sized_range<ViewTested>);
87
+ static_assert (!std::ranges::sized_range<const ViewTested>);
88
+
89
+ std::ranges::take_view<ViewTested> tv{};
69
90
ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<int *>);
91
+ ASSERT_SAME_TYPE (decltype (std::as_const (tv).begin ()), std::counted_iterator<int *>);
70
92
}
71
93
72
- // simple-view<V> && sized_range<V> && !size_range<! V>
94
+ // ! simple-view<V> && ! sized_range<V>
73
95
{
74
- std::ranges::take_view<NonCommonSimpleView> tv{};
75
- ASSERT_SAME_TYPE (decltype (tv.begin ()), std::counted_iterator<int *>);
76
- ASSERT_SAME_TYPE (decltype (std::as_const (tv).begin ()), std::counted_iterator<int *>);
96
+ using ViewTested = NonSimpleNonSizedView;
97
+ static_assert (!simple_view<ViewTested>);
98
+ static_assert (!std::ranges::sized_range<ViewTested>);
99
+
100
+ std::ranges::take_view<ViewTested> tv{ViewTested{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 () == CountedCommonInputIterPtrConstInt (CommonInputIterPtrConstInt (buffer), 4 ));
103
+ ASSERT_SAME_TYPE (decltype (tv.begin ()), CountedCommonInputIterPtrConstInt);
77
104
}
78
105
106
+ // !simple-view<V> && sized_range<V>
107
+ {
108
+ using ViewTested = NonSimpleSizedView;
109
+ static_assert (!simple_view<ViewTested>);
110
+ static_assert (std::ranges::sized_range<ViewTested>);
111
+
112
+ std::ranges::take_view<ViewTested> tv{ViewTested{buffer, buffer + 2 }, 4 };
113
+ // The count for the counted iterator is the min(2, 4) (i.e., 2).
114
+ assert (tv.begin () == CountedCommonInputIterPtrConstInt (CommonInputIterPtrConstInt (buffer), 2 ));
115
+ ASSERT_SAME_TYPE (decltype (tv.begin ()), CountedCommonInputIterPtrConstInt);
116
+ }
117
+
118
+ // !simple-view<V> && sized_range<V> && random_access_range<V>
119
+ {
120
+ using ViewTested = NonSimpleSizedRandomView;
121
+ static_assert (!simple_view<ViewTested>);
122
+ static_assert (std::ranges::sized_range<ViewTested>);
123
+ static_assert (std::ranges::random_access_range<ViewTested>);
124
+
125
+ std::ranges::take_view<ViewTested> tv{ViewTested{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