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 
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 
84 int main(int, char**) {
85   test();
86   static_assert(test());
87 
88   return 0;
89 }
90