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