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 inner-iterator& x, const inner-iterator& y);
12e53c461bSKonstantin Varlamov //   requires forward_range<Base>;
13e53c461bSKonstantin Varlamov //
14e53c461bSKonstantin Varlamov // friend constexpr bool operator==(const inner-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   // When `View` is a forward range, `inner-iterator` supports both overloads of `operator==`.
27e53c461bSKonstantin Varlamov   {
28e53c461bSKonstantin Varlamov     SplitViewForward v("abc def", " ");
29e53c461bSKonstantin Varlamov     auto val = *v.begin();
30e53c461bSKonstantin Varlamov     auto b = val.begin();
31e53c461bSKonstantin Varlamov     std::same_as<std::default_sentinel_t> decltype(auto) e = val.end();
32e53c461bSKonstantin Varlamov 
33e53c461bSKonstantin Varlamov     // inner-iterator == inner-iterator
34e53c461bSKonstantin Varlamov     {
35e53c461bSKonstantin Varlamov       assert(b == b);
36e53c461bSKonstantin Varlamov       assert(!(b != b));
37e53c461bSKonstantin Varlamov     }
38e53c461bSKonstantin Varlamov 
39e53c461bSKonstantin Varlamov     // inner-iterator == default_sentinel
40e53c461bSKonstantin Varlamov     {
41e53c461bSKonstantin Varlamov       assert(!(b == e));
42e53c461bSKonstantin Varlamov       assert(b != e);
43e53c461bSKonstantin Varlamov 
44e53c461bSKonstantin Varlamov       assert(!(b == std::default_sentinel));
45e53c461bSKonstantin Varlamov       assert(b != std::default_sentinel);
46e53c461bSKonstantin Varlamov     }
47e53c461bSKonstantin Varlamov   }
48e53c461bSKonstantin Varlamov 
49e53c461bSKonstantin Varlamov   // When `View` is an input range, `inner-iterator only supports comparing an `inner-iterator` to the default sentinel.
50e53c461bSKonstantin Varlamov   {
51e53c461bSKonstantin Varlamov     SplitViewInput v("abc def", ' ');
52e53c461bSKonstantin Varlamov     auto val = *v.begin();
53e53c461bSKonstantin Varlamov     auto b = val.begin();
54e53c461bSKonstantin Varlamov     std::same_as<std::default_sentinel_t> decltype(auto) e = val.end();
55e53c461bSKonstantin Varlamov 
56*808d794aSWill Hawkins     static_assert(!weakly_equality_comparable_with<decltype(b), decltype(b)>);
57e53c461bSKonstantin Varlamov 
58e53c461bSKonstantin Varlamov     assert(!(b == std::default_sentinel));
59e53c461bSKonstantin Varlamov     assert(b != std::default_sentinel);
60e53c461bSKonstantin Varlamov     assert(!(b == e));
61e53c461bSKonstantin Varlamov     assert(b != e);
62e53c461bSKonstantin Varlamov   }
63e53c461bSKonstantin Varlamov 
64e53c461bSKonstantin Varlamov   return true;
65e53c461bSKonstantin Varlamov }
66e53c461bSKonstantin Varlamov 
main(int,char **)67e53c461bSKonstantin Varlamov int main(int, char**) {
68e53c461bSKonstantin Varlamov   test();
69e53c461bSKonstantin Varlamov   static_assert(test());
70e53c461bSKonstantin Varlamov 
71e53c461bSKonstantin Varlamov   return 0;
72e53c461bSKonstantin Varlamov }
73