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 // constexpr outer-iterator& outer-iterator::operator++();
12e53c461bSKonstantin Varlamov // constexpr decltype(auto) outer-iterator::operator++(int);
13e53c461bSKonstantin Varlamov
14e53c461bSKonstantin Varlamov // Note that corner cases are tested in `range.lazy.split/general.pass.cpp`.
15e53c461bSKonstantin Varlamov
16e53c461bSKonstantin Varlamov #include <ranges>
17e53c461bSKonstantin Varlamov
18e53c461bSKonstantin Varlamov #include <algorithm>
19*ae2ae84fSJoe Loser #include <cassert>
20*ae2ae84fSJoe Loser #include <string>
21e53c461bSKonstantin Varlamov #include "../types.h"
22e53c461bSKonstantin Varlamov
test()23e53c461bSKonstantin Varlamov constexpr bool test() {
24*ae2ae84fSJoe Loser using namespace std::string_literals;
25e53c461bSKonstantin Varlamov // Can call `outer-iterator::operator++`; `View` is a forward range.
26e53c461bSKonstantin Varlamov {
27e53c461bSKonstantin Varlamov SplitViewForward v("abc def ghi", " ");
28e53c461bSKonstantin Varlamov
29e53c461bSKonstantin Varlamov // ++i
30e53c461bSKonstantin Varlamov {
31e53c461bSKonstantin Varlamov auto i = v.begin();
32*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "abc"s));
33e53c461bSKonstantin Varlamov
34e53c461bSKonstantin Varlamov decltype(auto) i2 = ++i;
35e53c461bSKonstantin Varlamov static_assert(std::is_lvalue_reference_v<decltype(i2)>);
36e53c461bSKonstantin Varlamov assert(&i2 == &i);
37*ae2ae84fSJoe Loser assert(std::ranges::equal(*i2, "def"s));
38e53c461bSKonstantin Varlamov }
39e53c461bSKonstantin Varlamov
40e53c461bSKonstantin Varlamov // i++
41e53c461bSKonstantin Varlamov {
42e53c461bSKonstantin Varlamov auto i = v.begin();
43*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "abc"s));
44e53c461bSKonstantin Varlamov
45e53c461bSKonstantin Varlamov decltype(auto) i2 = i++;
46e53c461bSKonstantin Varlamov static_assert(!std::is_reference_v<decltype(i2)>);
47*ae2ae84fSJoe Loser assert(std::ranges::equal(*i2, "abc"s));
48*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "def"s));
49e53c461bSKonstantin Varlamov }
50e53c461bSKonstantin Varlamov }
51e53c461bSKonstantin Varlamov
52e53c461bSKonstantin Varlamov // Can call `outer-iterator::operator++`; `View` is an input range.
53e53c461bSKonstantin Varlamov {
54e53c461bSKonstantin Varlamov SplitViewInput v("abc def ghi", ' ');
55e53c461bSKonstantin Varlamov
56e53c461bSKonstantin Varlamov // ++i
57e53c461bSKonstantin Varlamov {
58e53c461bSKonstantin Varlamov auto i = v.begin();
59*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "abc"s));
60e53c461bSKonstantin Varlamov
61e53c461bSKonstantin Varlamov decltype(auto) i2 = ++i;
62e53c461bSKonstantin Varlamov static_assert(std::is_lvalue_reference_v<decltype(i2)>);
63e53c461bSKonstantin Varlamov assert(&i2 == &i);
64*ae2ae84fSJoe Loser assert(std::ranges::equal(*i2, "def"s));
65e53c461bSKonstantin Varlamov }
66e53c461bSKonstantin Varlamov
67e53c461bSKonstantin Varlamov // i++
68e53c461bSKonstantin Varlamov {
69e53c461bSKonstantin Varlamov auto i = v.begin();
70*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "abc"s));
71e53c461bSKonstantin Varlamov
72e53c461bSKonstantin Varlamov static_assert(std::is_void_v<decltype(i++)>);
73e53c461bSKonstantin Varlamov i++;
74*ae2ae84fSJoe Loser assert(std::ranges::equal(*i, "def"s));
75e53c461bSKonstantin Varlamov }
76e53c461bSKonstantin Varlamov }
77e53c461bSKonstantin Varlamov
78e53c461bSKonstantin Varlamov return true;
79e53c461bSKonstantin Varlamov }
80e53c461bSKonstantin Varlamov
main(int,char **)81e53c461bSKonstantin Varlamov int main(int, char**) {
82e53c461bSKonstantin Varlamov test();
83e53c461bSKonstantin Varlamov static_assert(test());
84e53c461bSKonstantin Varlamov
85e53c461bSKonstantin Varlamov return 0;
86e53c461bSKonstantin Varlamov }
87