1e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2e53c461bSKonstantin Varlamov //
3e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e53c461bSKonstantin Varlamov //
7e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8e53c461bSKonstantin Varlamov
9e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10e53c461bSKonstantin Varlamov
11e53c461bSKonstantin Varlamov // friend constexpr bool operator==(const outer-iterator& x, const outer-iterator& y)
12e53c461bSKonstantin Varlamov // requires forward_range<Base>;
13e53c461bSKonstantin Varlamov //
14e53c461bSKonstantin Varlamov // friend constexpr bool operator==(const outer-iterator& x, default_sentinel_t);
15e53c461bSKonstantin Varlamov
16e53c461bSKonstantin Varlamov #include <ranges>
17e53c461bSKonstantin Varlamov
18e53c461bSKonstantin Varlamov #include <concepts>
19e53c461bSKonstantin Varlamov #include <string_view>
20*808d794aSWill Hawkins
21e53c461bSKonstantin Varlamov #include "../types.h"
22e53c461bSKonstantin Varlamov
23*808d794aSWill Hawkins #include "test_range.h"
24e53c461bSKonstantin Varlamov
test()25e53c461bSKonstantin Varlamov constexpr bool test() {
26e53c461bSKonstantin Varlamov // Forward range supports both overloads of `operator==`.
27e53c461bSKonstantin Varlamov {
28e53c461bSKonstantin Varlamov // outer-iterator == outer-iterator
29e53c461bSKonstantin Varlamov {
30e53c461bSKonstantin Varlamov SplitViewForward v("abc def", " ");
31e53c461bSKonstantin Varlamov auto b = v.begin(), e = v.end();
32e53c461bSKonstantin Varlamov
33e53c461bSKonstantin Varlamov assert(b == b);
34e53c461bSKonstantin Varlamov assert(!(b != b));
35e53c461bSKonstantin Varlamov
36e53c461bSKonstantin Varlamov assert(e == e);
37e53c461bSKonstantin Varlamov assert(!(e != e));
38e53c461bSKonstantin Varlamov
39e53c461bSKonstantin Varlamov assert(!(b == e));
40e53c461bSKonstantin Varlamov assert(b != e);
41e53c461bSKonstantin Varlamov }
42e53c461bSKonstantin Varlamov
43e53c461bSKonstantin Varlamov // outer-iterator == default_sentinel
44e53c461bSKonstantin Varlamov {
45e53c461bSKonstantin Varlamov SplitViewForward v("abc def", " ");
46e53c461bSKonstantin Varlamov auto b = v.begin(), e = v.end();
47e53c461bSKonstantin Varlamov
48e53c461bSKonstantin Varlamov assert(!(b == std::default_sentinel));
49e53c461bSKonstantin Varlamov assert(b != std::default_sentinel);
50e53c461bSKonstantin Varlamov assert(e == std::default_sentinel);
51e53c461bSKonstantin Varlamov assert(!(e != std::default_sentinel));
52e53c461bSKonstantin Varlamov }
53e53c461bSKonstantin Varlamov
54e53c461bSKonstantin Varlamov // Default-constructed `outer-iterator`s compare equal.
55e53c461bSKonstantin Varlamov {
56e53c461bSKonstantin Varlamov OuterIterForward i1, i2;
57e53c461bSKonstantin Varlamov assert(i1 == i2);
58e53c461bSKonstantin Varlamov assert(!(i1 != i2));
59e53c461bSKonstantin Varlamov }
60e53c461bSKonstantin Varlamov }
61e53c461bSKonstantin Varlamov
62e53c461bSKonstantin Varlamov // Input range only supports comparing an `outer-iterator` to the default sentinel.
63e53c461bSKonstantin Varlamov {
64e53c461bSKonstantin Varlamov using namespace std::string_view_literals;
65e53c461bSKonstantin Varlamov SplitViewInput v("abc def"sv, ' ');
66e53c461bSKonstantin Varlamov auto b = v.begin();
67e53c461bSKonstantin Varlamov std::same_as<std::default_sentinel_t> decltype(auto) e = v.end();
68e53c461bSKonstantin Varlamov
69*808d794aSWill Hawkins static_assert(!weakly_equality_comparable_with<decltype(b), decltype(b)>);
70e53c461bSKonstantin Varlamov
71e53c461bSKonstantin Varlamov assert(!(b == std::default_sentinel));
72e53c461bSKonstantin Varlamov assert(b != std::default_sentinel);
73e53c461bSKonstantin Varlamov assert(!(b == e));
74e53c461bSKonstantin Varlamov assert(b != e);
75e53c461bSKonstantin Varlamov }
76e53c461bSKonstantin Varlamov
77e53c461bSKonstantin Varlamov return true;
78e53c461bSKonstantin Varlamov }
79e53c461bSKonstantin Varlamov
main(int,char **)80e53c461bSKonstantin Varlamov int main(int, char**) {
81e53c461bSKonstantin Varlamov test();
82e53c461bSKonstantin Varlamov static_assert(test());
83e53c461bSKonstantin Varlamov
84e53c461bSKonstantin Varlamov return 0;
85e53c461bSKonstantin Varlamov }
86