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