1*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2*e53c461bSKonstantin Varlamov //
3*e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5*e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e53c461bSKonstantin Varlamov //
7*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8*e53c461bSKonstantin Varlamov
9*e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10*e53c461bSKonstantin Varlamov
11*e53c461bSKonstantin Varlamov // std::ranges::lazy_split_view::outer-iterator::value_type::begin()
12*e53c461bSKonstantin Varlamov
13*e53c461bSKonstantin Varlamov #include <ranges>
14*e53c461bSKonstantin Varlamov
15*e53c461bSKonstantin Varlamov #include <cassert>
16*e53c461bSKonstantin Varlamov #include "../types.h"
17*e53c461bSKonstantin Varlamov
test()18*e53c461bSKonstantin Varlamov constexpr bool test() {
19*e53c461bSKonstantin Varlamov // `View` is a forward range.
20*e53c461bSKonstantin Varlamov {
21*e53c461bSKonstantin Varlamov CopyableView input("a");
22*e53c461bSKonstantin Varlamov
23*e53c461bSKonstantin Varlamov // Non-const.
24*e53c461bSKonstantin Varlamov {
25*e53c461bSKonstantin Varlamov SplitViewCopyable v(input, "b");
26*e53c461bSKonstantin Varlamov auto val = *v.begin();
27*e53c461bSKonstantin Varlamov assert(val.begin().base() == input.begin());
28*e53c461bSKonstantin Varlamov }
29*e53c461bSKonstantin Varlamov
30*e53c461bSKonstantin Varlamov // Const.
31*e53c461bSKonstantin Varlamov {
32*e53c461bSKonstantin Varlamov SplitViewCopyable v(input, "b");
33*e53c461bSKonstantin Varlamov const auto val = *v.begin();
34*e53c461bSKonstantin Varlamov assert(val.begin().base() == input.begin());
35*e53c461bSKonstantin Varlamov }
36*e53c461bSKonstantin Varlamov }
37*e53c461bSKonstantin Varlamov
38*e53c461bSKonstantin Varlamov // `View` is an input range.
39*e53c461bSKonstantin Varlamov {
40*e53c461bSKonstantin Varlamov InputView input("a");
41*e53c461bSKonstantin Varlamov
42*e53c461bSKonstantin Varlamov // Non-const.
43*e53c461bSKonstantin Varlamov {
44*e53c461bSKonstantin Varlamov SplitViewInput v(input, 'b');
45*e53c461bSKonstantin Varlamov auto val = *v.begin();
46*e53c461bSKonstantin Varlamov // Copies of `InputView` are independent and the iterators won't compare the same.
47*e53c461bSKonstantin Varlamov assert(*val.begin().base() == *input.begin());
48*e53c461bSKonstantin Varlamov }
49*e53c461bSKonstantin Varlamov
50*e53c461bSKonstantin Varlamov // Const.
51*e53c461bSKonstantin Varlamov {
52*e53c461bSKonstantin Varlamov SplitViewInput v(input, 'b');
53*e53c461bSKonstantin Varlamov const auto val = *v.begin();
54*e53c461bSKonstantin Varlamov // Copies of `InputView` are independent and the iterators won't compare the same.
55*e53c461bSKonstantin Varlamov assert(*val.begin().base() == *input.begin());
56*e53c461bSKonstantin Varlamov }
57*e53c461bSKonstantin Varlamov }
58*e53c461bSKonstantin Varlamov
59*e53c461bSKonstantin Varlamov return true;
60*e53c461bSKonstantin Varlamov }
61*e53c461bSKonstantin Varlamov
main(int,char **)62*e53c461bSKonstantin Varlamov int main(int, char**) {
63*e53c461bSKonstantin Varlamov assert(test());
64*e53c461bSKonstantin Varlamov static_assert(test());
65*e53c461bSKonstantin Varlamov
66*e53c461bSKonstantin Varlamov return 0;
67*e53c461bSKonstantin Varlamov }
68