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 // friend constexpr bool operator==(const iterator& x, const iterator& y);
14065dc485SJakub Mazurkiewicz // friend constexpr bool operator==(const iterator& x, default_sentinel_t);
15065dc485SJakub Mazurkiewicz
16065dc485SJakub Mazurkiewicz #include <ranges>
17065dc485SJakub Mazurkiewicz
18065dc485SJakub Mazurkiewicz #include <array>
19065dc485SJakub Mazurkiewicz #include <cassert>
20065dc485SJakub Mazurkiewicz #include <concepts>
21065dc485SJakub Mazurkiewicz #include <functional>
22065dc485SJakub Mazurkiewicz #include <utility>
23065dc485SJakub Mazurkiewicz
24065dc485SJakub Mazurkiewicz #include "../types.h"
25065dc485SJakub Mazurkiewicz #include "test_iterators.h"
26065dc485SJakub Mazurkiewicz #include "test_macros.h"
27065dc485SJakub Mazurkiewicz
28*8c0a6112SWill Hawkins template <class Iter, class Sent = sentinel_wrapper<Iter>>
test()29065dc485SJakub Mazurkiewicz constexpr void test() {
30*8c0a6112SWill Hawkins using Underlying = View<Iter, Sent>;
31065dc485SJakub Mazurkiewicz using ChunkByView = std::ranges::chunk_by_view<Underlying, std::ranges::less_equal>;
32065dc485SJakub Mazurkiewicz using ChunkByIterator = std::ranges::iterator_t<ChunkByView>;
33065dc485SJakub Mazurkiewicz
34f1db578fSStephan T. Lavavej auto make_chunk_by_view = [](auto& arr) {
35*8c0a6112SWill Hawkins View view{Iter(arr.data()), Sent(Iter(arr.data() + arr.size()))};
36065dc485SJakub Mazurkiewicz return ChunkByView(std::move(view), std::ranges::less_equal{});
37065dc485SJakub Mazurkiewicz };
38065dc485SJakub Mazurkiewicz
39065dc485SJakub Mazurkiewicz // Test operator==
40065dc485SJakub Mazurkiewicz {
41065dc485SJakub Mazurkiewicz std::array array{0, 1, 2};
42f1db578fSStephan T. Lavavej ChunkByView view = make_chunk_by_view(array);
43065dc485SJakub Mazurkiewicz ChunkByIterator i = view.begin();
44065dc485SJakub Mazurkiewicz ChunkByIterator j = view.begin();
45065dc485SJakub Mazurkiewicz
46065dc485SJakub Mazurkiewicz std::same_as<bool> decltype(auto) result = (i == j);
47065dc485SJakub Mazurkiewicz assert(result);
48065dc485SJakub Mazurkiewicz ++i;
49065dc485SJakub Mazurkiewicz assert(!(i == j));
50065dc485SJakub Mazurkiewicz }
51065dc485SJakub Mazurkiewicz
52065dc485SJakub Mazurkiewicz // Test synthesized operator!=
53065dc485SJakub Mazurkiewicz {
54065dc485SJakub Mazurkiewicz std::array array{0, 1, 2};
55f1db578fSStephan T. Lavavej ChunkByView view = make_chunk_by_view(array);
56065dc485SJakub Mazurkiewicz ChunkByIterator i = view.begin();
57065dc485SJakub Mazurkiewicz ChunkByIterator j = view.begin();
58065dc485SJakub Mazurkiewicz
59065dc485SJakub Mazurkiewicz std::same_as<bool> decltype(auto) result = (i != j);
60065dc485SJakub Mazurkiewicz assert(!result);
61065dc485SJakub Mazurkiewicz ++i;
62065dc485SJakub Mazurkiewicz assert(i != j);
63065dc485SJakub Mazurkiewicz }
64065dc485SJakub Mazurkiewicz
65065dc485SJakub Mazurkiewicz // Test operator== with std::default_sentinel_t
66065dc485SJakub Mazurkiewicz {
67065dc485SJakub Mazurkiewicz std::array array{0, 1, 2};
68f1db578fSStephan T. Lavavej ChunkByView view = make_chunk_by_view(array);
69065dc485SJakub Mazurkiewicz ChunkByIterator i = view.begin();
70065dc485SJakub Mazurkiewicz
71065dc485SJakub Mazurkiewicz std::same_as<bool> decltype(auto) result = (i == std::default_sentinel);
72065dc485SJakub Mazurkiewicz assert(!result);
73065dc485SJakub Mazurkiewicz ++i;
74065dc485SJakub Mazurkiewicz assert(i == std::default_sentinel);
75065dc485SJakub Mazurkiewicz }
76065dc485SJakub Mazurkiewicz
77065dc485SJakub Mazurkiewicz // Test synthesized operator!= with std::default_sentinel_t
78065dc485SJakub Mazurkiewicz {
79065dc485SJakub Mazurkiewicz std::array array{0, 1, 2};
80f1db578fSStephan T. Lavavej ChunkByView view = make_chunk_by_view(array);
81065dc485SJakub Mazurkiewicz ChunkByIterator i = view.begin();
82065dc485SJakub Mazurkiewicz
83065dc485SJakub Mazurkiewicz std::same_as<bool> decltype(auto) result = (i != std::default_sentinel);
84065dc485SJakub Mazurkiewicz assert(result);
85065dc485SJakub Mazurkiewicz ++i;
86065dc485SJakub Mazurkiewicz assert(!(i != std::default_sentinel));
87065dc485SJakub Mazurkiewicz }
88065dc485SJakub Mazurkiewicz }
89065dc485SJakub Mazurkiewicz
90065dc485SJakub Mazurkiewicz struct TestWithPair {
91065dc485SJakub Mazurkiewicz template <class Iterator>
operator ()TestWithPair92065dc485SJakub Mazurkiewicz constexpr void operator()() const {
93065dc485SJakub Mazurkiewicz // Test with pair of iterators
94065dc485SJakub Mazurkiewicz test<Iterator, Iterator>();
95065dc485SJakub Mazurkiewicz
96065dc485SJakub Mazurkiewicz // Test with iterator-sentinel pair
97065dc485SJakub Mazurkiewicz test<Iterator>();
98065dc485SJakub Mazurkiewicz }
99065dc485SJakub Mazurkiewicz };
100065dc485SJakub Mazurkiewicz
tests()101065dc485SJakub Mazurkiewicz constexpr bool tests() {
102065dc485SJakub Mazurkiewicz TestWithPair tester;
103065dc485SJakub Mazurkiewicz types::for_each(types::forward_iterator_list<int*>{}, tester);
104065dc485SJakub Mazurkiewicz types::for_each(types::forward_iterator_list<int const*>{}, tester);
105065dc485SJakub Mazurkiewicz
106065dc485SJakub Mazurkiewicz return true;
107065dc485SJakub Mazurkiewicz }
108065dc485SJakub Mazurkiewicz
main(int,char **)109065dc485SJakub Mazurkiewicz int main(int, char**) {
110065dc485SJakub Mazurkiewicz tests();
111065dc485SJakub Mazurkiewicz static_assert(tests());
112065dc485SJakub Mazurkiewicz return 0;
113065dc485SJakub Mazurkiewicz }
114