10f4b41e0Szoecarver //===----------------------------------------------------------------------===//
20f4b41e0Szoecarver //
30f4b41e0Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40f4b41e0Szoecarver // See https://llvm.org/LICENSE.txt for license information.
50f4b41e0Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60f4b41e0Szoecarver //
70f4b41e0Szoecarver //===----------------------------------------------------------------------===//
80f4b41e0Szoecarver
90f4b41e0Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
100f4b41e0Szoecarver
110f4b41e0Szoecarver // constexpr auto begin() requires (!simple-view<V>);
120f4b41e0Szoecarver // constexpr auto begin() const requires range<const V>;
130f4b41e0Szoecarver
140f4b41e0Szoecarver #include <cassert>
15*8b37ec1fSWill Hawkins #include <ranges>
16*8b37ec1fSWill Hawkins #include <utility>
170f4b41e0Szoecarver
180f4b41e0Szoecarver #include "test_macros.h"
190f4b41e0Szoecarver #include "test_iterators.h"
200f4b41e0Szoecarver #include "test_range.h"
210f4b41e0Szoecarver #include "types.h"
220f4b41e0Szoecarver
23597b90ebSHui Xie struct NonCommonSimpleView : std::ranges::view_base {
24597b90ebSHui Xie int* begin() const;
25597b90ebSHui Xie sentinel_wrapper<int*> end() const;
sizeNonCommonSimpleView26fb855eb9SMark de Wever std::size_t size() { return 0; } // deliberately non-const
27597b90ebSHui Xie };
28597b90ebSHui Xie static_assert(std::ranges::sized_range<NonCommonSimpleView>);
29597b90ebSHui Xie static_assert(!std::ranges::sized_range<const NonCommonSimpleView>);
30597b90ebSHui Xie
31*8b37ec1fSWill Hawkins using CommonInputIterPtrConstInt = common_input_iterator<const int*>;
32*8b37ec1fSWill Hawkins using CountedCommonInputIterPtrConstInt = std::counted_iterator<CommonInputIterPtrConstInt>;
33*8b37ec1fSWill Hawkins
test()340f4b41e0Szoecarver constexpr bool test() {
350f4b41e0Szoecarver int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
360f4b41e0Szoecarver
37*8b37ec1fSWill Hawkins // simple-view<V> && sized_range<V> && random_access_range<V>
380f4b41e0Szoecarver {
39*8b37ec1fSWill Hawkins using ViewTested = SizedRandomAccessView;
40*8b37ec1fSWill Hawkins static_assert(simple_view<ViewTested>);
41*8b37ec1fSWill Hawkins static_assert(std::ranges::sized_range<ViewTested>);
42*8b37ec1fSWill Hawkins static_assert(std::ranges::random_access_range<ViewTested>);
43*8b37ec1fSWill Hawkins
44*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv(ViewTested(buffer), 4);
45*8b37ec1fSWill Hawkins assert(tv.begin() == ViewTested(buffer).begin());
460f4b41e0Szoecarver ASSERT_SAME_TYPE(decltype(tv.begin()), RandomAccessIter);
47*8b37ec1fSWill Hawkins
48*8b37ec1fSWill Hawkins const std::ranges::take_view<ViewTested> ctv(ViewTested(buffer), 4);
49*8b37ec1fSWill Hawkins assert(ctv.begin() == ViewTested(buffer).begin());
50*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(ctv.begin()), RandomAccessIter);
510f4b41e0Szoecarver }
520f4b41e0Szoecarver
53*8b37ec1fSWill Hawkins // simple-view<V> && sized_range<V> && !random_access_range<V>
540f4b41e0Szoecarver {
55*8b37ec1fSWill Hawkins using ViewTested = SizedForwardView;
56*8b37ec1fSWill Hawkins static_assert(simple_view<ViewTested>);
57*8b37ec1fSWill Hawkins static_assert(std::ranges::sized_range<ViewTested>);
58*8b37ec1fSWill Hawkins static_assert(!std::ranges::random_access_range<ViewTested>);
590f4b41e0Szoecarver
60*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv(ViewTested{buffer}, 16); // underlying size is 8
61*8b37ec1fSWill Hawkins assert(tv.begin() == std::counted_iterator<ForwardIter>(ForwardIter(buffer), 8)); // expect min(8, 16)
620f4b41e0Szoecarver ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<ForwardIter>);
63*8b37ec1fSWill Hawkins
64*8b37ec1fSWill Hawkins const std::ranges::take_view<ViewTested> ctv(ViewTested{buffer}, 4);
65*8b37ec1fSWill Hawkins assert(ctv.begin() == std::counted_iterator<ForwardIter>(ForwardIter(buffer), 4));
66*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(ctv.begin()), std::counted_iterator<ForwardIter>);
670f4b41e0Szoecarver }
680f4b41e0Szoecarver
69*8b37ec1fSWill Hawkins // simple-view<V> && !sized_range<V>
700f4b41e0Szoecarver {
71*8b37ec1fSWill Hawkins using ViewTested = MoveOnlyView;
72*8b37ec1fSWill Hawkins static_assert(simple_view<ViewTested>);
73*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv(ViewTested{buffer}, 4);
740f4b41e0Szoecarver assert(tv.begin() == std::counted_iterator<int*>(buffer, 4));
750f4b41e0Szoecarver ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<int*>);
76*8b37ec1fSWill Hawkins
77*8b37ec1fSWill Hawkins const std::ranges::take_view<ViewTested> ctv(ViewTested{buffer}, 4);
78*8b37ec1fSWill Hawkins assert(ctv.begin() == std::counted_iterator<int*>(buffer, 4));
79*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(ctv.begin()), std::counted_iterator<int*>);
800f4b41e0Szoecarver }
810f4b41e0Szoecarver
82*8b37ec1fSWill Hawkins // simple-view<V> && sized_range<V> && !sized_range<const V>
830f4b41e0Szoecarver {
84*8b37ec1fSWill Hawkins using ViewTested = NonCommonSimpleView;
85*8b37ec1fSWill Hawkins static_assert(simple_view<ViewTested>);
86*8b37ec1fSWill Hawkins static_assert(std::ranges::sized_range<ViewTested>);
87*8b37ec1fSWill Hawkins static_assert(!std::ranges::sized_range<const ViewTested>);
880f4b41e0Szoecarver
89*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv{};
90597b90ebSHui Xie ASSERT_SAME_TYPE(decltype(tv.begin()), std::counted_iterator<int*>);
91597b90ebSHui Xie ASSERT_SAME_TYPE(decltype(std::as_const(tv).begin()), std::counted_iterator<int*>);
92597b90ebSHui Xie }
93597b90ebSHui Xie
94*8b37ec1fSWill Hawkins // !simple-view<V> && !sized_range<V>
95*8b37ec1fSWill Hawkins {
96*8b37ec1fSWill Hawkins using ViewTested = NonSimpleNonSizedView;
97*8b37ec1fSWill Hawkins static_assert(!simple_view<ViewTested>);
98*8b37ec1fSWill Hawkins static_assert(!std::ranges::sized_range<ViewTested>);
99*8b37ec1fSWill Hawkins
100*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv{ViewTested{buffer, buffer + 2}, 4};
101*8b37ec1fSWill Hawkins // The count for the counted iterator is the count of the take_view (i.e., 4)
102*8b37ec1fSWill Hawkins assert(tv.begin() == CountedCommonInputIterPtrConstInt(CommonInputIterPtrConstInt(buffer), 4));
103*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(tv.begin()), CountedCommonInputIterPtrConstInt);
104*8b37ec1fSWill Hawkins }
105*8b37ec1fSWill Hawkins
106*8b37ec1fSWill Hawkins // !simple-view<V> && sized_range<V>
107*8b37ec1fSWill Hawkins {
108*8b37ec1fSWill Hawkins using ViewTested = NonSimpleSizedView;
109*8b37ec1fSWill Hawkins static_assert(!simple_view<ViewTested>);
110*8b37ec1fSWill Hawkins static_assert(std::ranges::sized_range<ViewTested>);
111*8b37ec1fSWill Hawkins
112*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv{ViewTested{buffer, buffer + 2}, 4};
113*8b37ec1fSWill Hawkins // The count for the counted iterator is the min(2, 4) (i.e., 2).
114*8b37ec1fSWill Hawkins assert(tv.begin() == CountedCommonInputIterPtrConstInt(CommonInputIterPtrConstInt(buffer), 2));
115*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(tv.begin()), CountedCommonInputIterPtrConstInt);
116*8b37ec1fSWill Hawkins }
117*8b37ec1fSWill Hawkins
118*8b37ec1fSWill Hawkins // !simple-view<V> && sized_range<V> && random_access_range<V>
119*8b37ec1fSWill Hawkins {
120*8b37ec1fSWill Hawkins using ViewTested = NonSimpleSizedRandomView;
121*8b37ec1fSWill Hawkins static_assert(!simple_view<ViewTested>);
122*8b37ec1fSWill Hawkins static_assert(std::ranges::sized_range<ViewTested>);
123*8b37ec1fSWill Hawkins static_assert(std::ranges::random_access_range<ViewTested>);
124*8b37ec1fSWill Hawkins
125*8b37ec1fSWill Hawkins std::ranges::take_view<ViewTested> tv{ViewTested{buffer, buffer + 2}, 4};
126*8b37ec1fSWill Hawkins assert(tv.begin() == random_access_iterator<const int*>(buffer));
127*8b37ec1fSWill Hawkins ASSERT_SAME_TYPE(decltype(tv.begin()), random_access_iterator<const int*>);
128*8b37ec1fSWill Hawkins }
1290f4b41e0Szoecarver return true;
1300f4b41e0Szoecarver }
1310f4b41e0Szoecarver
main(int,char **)1320f4b41e0Szoecarver int main(int, char**) {
1330f4b41e0Szoecarver test();
1340f4b41e0Szoecarver static_assert(test());
1350f4b41e0Szoecarver
1360f4b41e0Szoecarver return 0;
1370f4b41e0Szoecarver }
138