xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.chunk.by/range.chunk.by.iter/deref.pass.cpp (revision e99c4906e44ae3f921fa05356909d006cda8d954)
1065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
2065dc485SJakub Mazurkiewicz //
3065dc485SJakub Mazurkiewicz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4065dc485SJakub Mazurkiewicz // See https://llvm.org/LICENSE.txt for license information.
5065dc485SJakub Mazurkiewicz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6065dc485SJakub Mazurkiewicz //
7065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
8065dc485SJakub Mazurkiewicz 
9065dc485SJakub Mazurkiewicz // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10065dc485SJakub Mazurkiewicz 
11065dc485SJakub Mazurkiewicz // <ranges>
12065dc485SJakub Mazurkiewicz 
13065dc485SJakub Mazurkiewicz // constexpr value_type operator*() const;
14065dc485SJakub Mazurkiewicz 
15065dc485SJakub Mazurkiewicz #include <ranges>
16065dc485SJakub Mazurkiewicz 
17065dc485SJakub Mazurkiewicz #include <algorithm>
18065dc485SJakub Mazurkiewicz #include <array>
19065dc485SJakub Mazurkiewicz #include <cassert>
20*e99c4906SNikolas Klauser #include <cstddef>
21065dc485SJakub Mazurkiewicz #include <concepts>
22065dc485SJakub Mazurkiewicz #include <functional>
23065dc485SJakub Mazurkiewicz 
24065dc485SJakub Mazurkiewicz #include "../types.h"
25065dc485SJakub Mazurkiewicz #include "test_iterators.h"
26065dc485SJakub Mazurkiewicz 
27065dc485SJakub Mazurkiewicz template <class Iter, class Sent = sentinel_wrapper<Iter>>
28065dc485SJakub Mazurkiewicz constexpr void test() {
29065dc485SJakub Mazurkiewicz   using Underlying      = View<Iter, Sent>;
30065dc485SJakub Mazurkiewicz   using ChunkByView     = std::ranges::chunk_by_view<Underlying, std::ranges::less_equal>;
31065dc485SJakub Mazurkiewicz   using ChunkByIterator = std::ranges::iterator_t<ChunkByView>;
32065dc485SJakub Mazurkiewicz 
33065dc485SJakub Mazurkiewicz   std::array array{0, 1, 2, 3, -1, 0, 1, 2, -2, 3, 4, 5};
34065dc485SJakub Mazurkiewicz   std::array expected{std::array{0, 1, 2, 3}, std::array{-1, 0, 1, 2}, std::array{-2, 3, 4, 5}};
35f1db578fSStephan T. Lavavej   Underlying underlying{Iter{array.data()}, Sent{Iter{array.data() + array.size()}}};
36065dc485SJakub Mazurkiewicz   ChunkByView view{underlying, std::ranges::less_equal{}};
37065dc485SJakub Mazurkiewicz 
38065dc485SJakub Mazurkiewicz   size_t idx = 0;
39065dc485SJakub Mazurkiewicz   for (std::same_as<ChunkByIterator> auto iter = view.begin(); iter != view.end(); ++idx, ++iter) {
40065dc485SJakub Mazurkiewicz     std::same_as<typename ChunkByIterator::value_type> auto chunk = *iter;
41065dc485SJakub Mazurkiewicz     assert(std::ranges::equal(chunk, expected[idx]));
42065dc485SJakub Mazurkiewicz   }
43065dc485SJakub Mazurkiewicz }
44065dc485SJakub Mazurkiewicz 
45065dc485SJakub Mazurkiewicz constexpr bool tests() {
46065dc485SJakub Mazurkiewicz   // Check iterator-sentinel pair
47065dc485SJakub Mazurkiewicz   test<forward_iterator<int*>>();
48065dc485SJakub Mazurkiewicz   test<bidirectional_iterator<int*>>();
49065dc485SJakub Mazurkiewicz   test<random_access_iterator<int*>>();
50065dc485SJakub Mazurkiewicz   test<contiguous_iterator<int*>>();
51065dc485SJakub Mazurkiewicz   test<int*>();
52065dc485SJakub Mazurkiewicz 
53065dc485SJakub Mazurkiewicz   // Check iterator pair
54065dc485SJakub Mazurkiewicz   test<forward_iterator<int*>, forward_iterator<int*>>();
55065dc485SJakub Mazurkiewicz   test<bidirectional_iterator<int*>, bidirectional_iterator<int*>>();
56065dc485SJakub Mazurkiewicz   test<random_access_iterator<int*>, random_access_iterator<int*>>();
57065dc485SJakub Mazurkiewicz   test<contiguous_iterator<int*>, contiguous_iterator<int*>>();
58065dc485SJakub Mazurkiewicz   test<int*, int*>();
59065dc485SJakub Mazurkiewicz 
60065dc485SJakub Mazurkiewicz   return true;
61065dc485SJakub Mazurkiewicz }
62065dc485SJakub Mazurkiewicz 
63065dc485SJakub Mazurkiewicz int main(int, char**) {
64065dc485SJakub Mazurkiewicz   tests();
65065dc485SJakub Mazurkiewicz   static_assert(tests());
66065dc485SJakub Mazurkiewicz 
67065dc485SJakub Mazurkiewicz   return 0;
68065dc485SJakub Mazurkiewicz }
69