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