xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.chunk.by/end.pass.cpp (revision 065dc485bd4b33f6110993cc4b353f1e7c36cac3)
1*065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
2*065dc485SJakub Mazurkiewicz //
3*065dc485SJakub Mazurkiewicz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*065dc485SJakub Mazurkiewicz // See https://llvm.org/LICENSE.txt for license information.
5*065dc485SJakub Mazurkiewicz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*065dc485SJakub Mazurkiewicz //
7*065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
8*065dc485SJakub Mazurkiewicz 
9*065dc485SJakub Mazurkiewicz // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10*065dc485SJakub Mazurkiewicz 
11*065dc485SJakub Mazurkiewicz // <ranges>
12*065dc485SJakub Mazurkiewicz 
13*065dc485SJakub Mazurkiewicz // constexpr auto end();
14*065dc485SJakub Mazurkiewicz 
15*065dc485SJakub Mazurkiewicz #include <ranges>
16*065dc485SJakub Mazurkiewicz 
17*065dc485SJakub Mazurkiewicz #include <cassert>
18*065dc485SJakub Mazurkiewicz #include <concepts>
19*065dc485SJakub Mazurkiewicz #include <functional>
20*065dc485SJakub Mazurkiewicz 
21*065dc485SJakub Mazurkiewicz #include "test_iterators.h"
22*065dc485SJakub Mazurkiewicz 
23*065dc485SJakub Mazurkiewicz struct NonCommonRange : std::ranges::view_base {
24*065dc485SJakub Mazurkiewicz   using Iterator = forward_iterator<int*>;
25*065dc485SJakub Mazurkiewicz   using Sentinel = sentinel_wrapper<Iterator>;
NonCommonRangeNonCommonRange26*065dc485SJakub Mazurkiewicz   constexpr explicit NonCommonRange(int* b, int* e) : begin_(b), end_(e) {}
beginNonCommonRange27*065dc485SJakub Mazurkiewicz   constexpr Iterator begin() const { return Iterator(begin_); }
endNonCommonRange28*065dc485SJakub Mazurkiewicz   constexpr Sentinel end() const { return Sentinel(Iterator(end_)); }
29*065dc485SJakub Mazurkiewicz 
30*065dc485SJakub Mazurkiewicz private:
31*065dc485SJakub Mazurkiewicz   int* begin_;
32*065dc485SJakub Mazurkiewicz   int* end_;
33*065dc485SJakub Mazurkiewicz };
34*065dc485SJakub Mazurkiewicz 
35*065dc485SJakub Mazurkiewicz static_assert(std::ranges::forward_range<NonCommonRange>);
36*065dc485SJakub Mazurkiewicz static_assert(!std::ranges::common_range<NonCommonRange>);
37*065dc485SJakub Mazurkiewicz 
38*065dc485SJakub Mazurkiewicz struct CommonRange : std::ranges::view_base {
39*065dc485SJakub Mazurkiewicz   using Iterator = bidirectional_iterator<int*>;
CommonRangeCommonRange40*065dc485SJakub Mazurkiewicz   constexpr explicit CommonRange(int* b, int* e) : begin_(b), end_(e) {}
beginCommonRange41*065dc485SJakub Mazurkiewicz   constexpr Iterator begin() const { return Iterator(begin_); }
endCommonRange42*065dc485SJakub Mazurkiewicz   constexpr Iterator end() const { return Iterator(end_); }
43*065dc485SJakub Mazurkiewicz 
44*065dc485SJakub Mazurkiewicz private:
45*065dc485SJakub Mazurkiewicz   int* begin_;
46*065dc485SJakub Mazurkiewicz   int* end_;
47*065dc485SJakub Mazurkiewicz };
48*065dc485SJakub Mazurkiewicz 
49*065dc485SJakub Mazurkiewicz static_assert(std::ranges::bidirectional_range<CommonRange>);
50*065dc485SJakub Mazurkiewicz static_assert(std::ranges::common_range<CommonRange>);
51*065dc485SJakub Mazurkiewicz 
test()52*065dc485SJakub Mazurkiewicz constexpr bool test() {
53*065dc485SJakub Mazurkiewicz   int buff[] = {1, 0, 3, 1, 2, 3, 4, 5};
54*065dc485SJakub Mazurkiewicz 
55*065dc485SJakub Mazurkiewicz   // Check the return type of `end()`
56*065dc485SJakub Mazurkiewicz   {
57*065dc485SJakub Mazurkiewicz     CommonRange range(buff, buff + 1);
58*065dc485SJakub Mazurkiewicz     auto pred = [](int, int) { return true; };
59*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, pred);
60*065dc485SJakub Mazurkiewicz     using ChunkByView = decltype(view);
61*065dc485SJakub Mazurkiewicz     static_assert(std::ranges::common_range<ChunkByView>);
62*065dc485SJakub Mazurkiewicz     ASSERT_SAME_TYPE(std::ranges::sentinel_t<ChunkByView>, decltype(view.end()));
63*065dc485SJakub Mazurkiewicz   }
64*065dc485SJakub Mazurkiewicz 
65*065dc485SJakub Mazurkiewicz   // end() on an empty range
66*065dc485SJakub Mazurkiewicz   {
67*065dc485SJakub Mazurkiewicz     CommonRange range(buff, buff);
68*065dc485SJakub Mazurkiewicz     auto pred = [](int x, int y) { return x <= y; };
69*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, pred);
70*065dc485SJakub Mazurkiewicz     auto end = view.end();
71*065dc485SJakub Mazurkiewicz     assert(end == std::default_sentinel);
72*065dc485SJakub Mazurkiewicz   }
73*065dc485SJakub Mazurkiewicz 
74*065dc485SJakub Mazurkiewicz   // end() on a 1-element range
75*065dc485SJakub Mazurkiewicz   {
76*065dc485SJakub Mazurkiewicz     CommonRange range(buff, buff + 1);
77*065dc485SJakub Mazurkiewicz     auto pred = [](int& x, int& y) { return x <= y; };
78*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, pred);
79*065dc485SJakub Mazurkiewicz     auto end = view.end();
80*065dc485SJakub Mazurkiewicz     assert(base((*--end).begin()) == buff);
81*065dc485SJakub Mazurkiewicz     assert(base((*end).end()) == buff + 1);
82*065dc485SJakub Mazurkiewicz   }
83*065dc485SJakub Mazurkiewicz 
84*065dc485SJakub Mazurkiewicz   // end() on a 2-element range
85*065dc485SJakub Mazurkiewicz   {
86*065dc485SJakub Mazurkiewicz     CommonRange range(buff, buff + 2);
87*065dc485SJakub Mazurkiewicz     auto pred = [](int const& x, int const& y) { return x <= y; };
88*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, pred);
89*065dc485SJakub Mazurkiewicz     auto end = view.end();
90*065dc485SJakub Mazurkiewicz     assert(base((*--end).begin()) == buff + 1);
91*065dc485SJakub Mazurkiewicz     assert(base((*--end).end()) == buff + 1);
92*065dc485SJakub Mazurkiewicz   }
93*065dc485SJakub Mazurkiewicz 
94*065dc485SJakub Mazurkiewicz   // end() on a 8-element range
95*065dc485SJakub Mazurkiewicz   {
96*065dc485SJakub Mazurkiewicz     CommonRange range(buff, buff + 8);
97*065dc485SJakub Mazurkiewicz     auto pred = [](const int x, const int y) { return x < y; };
98*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, pred);
99*065dc485SJakub Mazurkiewicz     auto end = view.end();
100*065dc485SJakub Mazurkiewicz     assert(base((*--end).end()) == buff + 8);
101*065dc485SJakub Mazurkiewicz     assert(base((*--end).end()) == buff + 3);
102*065dc485SJakub Mazurkiewicz   }
103*065dc485SJakub Mazurkiewicz 
104*065dc485SJakub Mazurkiewicz   // end() on a non-common range
105*065dc485SJakub Mazurkiewicz   {
106*065dc485SJakub Mazurkiewicz     NonCommonRange range(buff, buff + 1);
107*065dc485SJakub Mazurkiewicz     std::ranges::chunk_by_view view(range, std::ranges::less_equal{});
108*065dc485SJakub Mazurkiewicz     auto end = view.end();
109*065dc485SJakub Mazurkiewicz     ASSERT_SAME_TYPE(std::default_sentinel_t, std::ranges::sentinel_t<decltype(view)>);
110*065dc485SJakub Mazurkiewicz     ASSERT_SAME_TYPE(std::default_sentinel_t, decltype(end));
111*065dc485SJakub Mazurkiewicz   }
112*065dc485SJakub Mazurkiewicz 
113*065dc485SJakub Mazurkiewicz   return true;
114*065dc485SJakub Mazurkiewicz }
115*065dc485SJakub Mazurkiewicz 
main(int,char **)116*065dc485SJakub Mazurkiewicz int main(int, char**) {
117*065dc485SJakub Mazurkiewicz   test();
118*065dc485SJakub Mazurkiewicz   static_assert(test());
119*065dc485SJakub Mazurkiewicz 
120*065dc485SJakub Mazurkiewicz   return 0;
121*065dc485SJakub Mazurkiewicz }
122