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