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 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11*e53c461bSKonstantin Varlamov
12*e53c461bSKonstantin Varlamov // class std::ranges::lazy_split_view;
13*e53c461bSKonstantin Varlamov
14*e53c461bSKonstantin Varlamov #include <ranges>
15*e53c461bSKonstantin Varlamov
16*e53c461bSKonstantin Varlamov #include <cassert>
17*e53c461bSKonstantin Varlamov #include <concepts>
18*e53c461bSKonstantin Varlamov #include <string_view>
19*e53c461bSKonstantin Varlamov #include <type_traits>
20*e53c461bSKonstantin Varlamov #include "types.h"
21*e53c461bSKonstantin Varlamov
22*e53c461bSKonstantin Varlamov using V = SplitViewForward;
23*e53c461bSKonstantin Varlamov
24*e53c461bSKonstantin Varlamov static_assert(std::is_base_of_v<std::ranges::view_interface<SplitViewForward>, SplitViewForward>);
25*e53c461bSKonstantin Varlamov
test()26*e53c461bSKonstantin Varlamov constexpr bool test() {
27*e53c461bSKonstantin Varlamov using namespace std::string_view_literals;
28*e53c461bSKonstantin Varlamov
29*e53c461bSKonstantin Varlamov // empty()
30*e53c461bSKonstantin Varlamov {
31*e53c461bSKonstantin Varlamov {
32*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view v("abc def", " ");
33*e53c461bSKonstantin Varlamov assert(!v.empty());
34*e53c461bSKonstantin Varlamov }
35*e53c461bSKonstantin Varlamov
36*e53c461bSKonstantin Varlamov {
37*e53c461bSKonstantin Varlamov // Note: an empty string literal would still produce a non-empty output because the terminating zero is treated as
38*e53c461bSKonstantin Varlamov // a separate character; hence the use of `string_view`.
39*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view v(""sv, "");
40*e53c461bSKonstantin Varlamov assert(v.empty());
41*e53c461bSKonstantin Varlamov }
42*e53c461bSKonstantin Varlamov }
43*e53c461bSKonstantin Varlamov
44*e53c461bSKonstantin Varlamov // operator bool()
45*e53c461bSKonstantin Varlamov {
46*e53c461bSKonstantin Varlamov {
47*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view v("abc", "");
48*e53c461bSKonstantin Varlamov assert(v);
49*e53c461bSKonstantin Varlamov }
50*e53c461bSKonstantin Varlamov
51*e53c461bSKonstantin Varlamov {
52*e53c461bSKonstantin Varlamov // Note: an empty string literal would still produce a non-empty output because the terminating zero is treated as
53*e53c461bSKonstantin Varlamov // a separate character; hence the use of `string_view`.
54*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view v(""sv, "");
55*e53c461bSKonstantin Varlamov assert(!v);
56*e53c461bSKonstantin Varlamov }
57*e53c461bSKonstantin Varlamov }
58*e53c461bSKonstantin Varlamov
59*e53c461bSKonstantin Varlamov // front()
60*e53c461bSKonstantin Varlamov {
61*e53c461bSKonstantin Varlamov SplitViewForward v("abc", "");
62*e53c461bSKonstantin Varlamov assert(*(v.front()).begin() == 'a');
63*e53c461bSKonstantin Varlamov }
64*e53c461bSKonstantin Varlamov
65*e53c461bSKonstantin Varlamov return true;
66*e53c461bSKonstantin Varlamov }
67*e53c461bSKonstantin Varlamov
main(int,char **)68*e53c461bSKonstantin Varlamov int main(int, char**) {
69*e53c461bSKonstantin Varlamov test();
70*e53c461bSKonstantin Varlamov static_assert(test());
71*e53c461bSKonstantin Varlamov
72*e53c461bSKonstantin Varlamov return 0;
73*e53c461bSKonstantin Varlamov }
74