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