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