xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.lazy.split/ctor.copy_move.pass.cpp (revision b8cb1dc9ea87faa8e8e9ab7a31710a8c0bb8b084)
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 // Test the implicitly-generated copy and move constructors since `lazy_split_view` has non-trivial members.
12*e53c461bSKonstantin Varlamov 
13*e53c461bSKonstantin Varlamov #include <ranges>
14*e53c461bSKonstantin Varlamov 
15*e53c461bSKonstantin Varlamov #include <cassert>
16*e53c461bSKonstantin Varlamov #include <string_view>
17*e53c461bSKonstantin Varlamov #include <utility>
18*e53c461bSKonstantin Varlamov #include "types.h"
19*e53c461bSKonstantin Varlamov 
test()20*e53c461bSKonstantin Varlamov constexpr bool test() {
21*e53c461bSKonstantin Varlamov   // Can copy `lazy_split_view`.
22*e53c461bSKonstantin Varlamov   {
23*e53c461bSKonstantin Varlamov     // Forward range.
24*e53c461bSKonstantin Varlamov     {
25*e53c461bSKonstantin Varlamov       std::ranges::lazy_split_view<std::string_view, std::string_view> v1("abc def", " ");
26*e53c461bSKonstantin Varlamov       auto v2 = v1;
27*e53c461bSKonstantin Varlamov       assert(v2.base() == v1.base());
28*e53c461bSKonstantin Varlamov     }
29*e53c461bSKonstantin Varlamov 
30*e53c461bSKonstantin Varlamov     // Input range.
31*e53c461bSKonstantin Varlamov     {
32*e53c461bSKonstantin Varlamov       SplitViewInput v1("abc def", ' ');
33*e53c461bSKonstantin Varlamov       auto v2 = v1;
34*e53c461bSKonstantin Varlamov       assert(v2.base() == v1.base());
35*e53c461bSKonstantin Varlamov     }
36*e53c461bSKonstantin Varlamov   }
37*e53c461bSKonstantin Varlamov 
38*e53c461bSKonstantin Varlamov   // Can move `lazy_split_view`.
39*e53c461bSKonstantin Varlamov   {
40*e53c461bSKonstantin Varlamov     // Forward range.
41*e53c461bSKonstantin Varlamov     {
42*e53c461bSKonstantin Varlamov       std::string_view base = "abc def";
43*e53c461bSKonstantin Varlamov       std::ranges::lazy_split_view<std::string_view, std::string_view> v1(base, " ");
44*e53c461bSKonstantin Varlamov       auto v2 = std::move(v1);
45*e53c461bSKonstantin Varlamov       assert(v2.base() == base);
46*e53c461bSKonstantin Varlamov     }
47*e53c461bSKonstantin Varlamov 
48*e53c461bSKonstantin Varlamov     // Input range.
49*e53c461bSKonstantin Varlamov     {
50*e53c461bSKonstantin Varlamov       InputView base("abc def");
51*e53c461bSKonstantin Varlamov       SplitViewInput v1(base, ' ');
52*e53c461bSKonstantin Varlamov       auto v2 = std::move(v1);
53*e53c461bSKonstantin Varlamov       assert(v2.base() == base);
54*e53c461bSKonstantin Varlamov     }
55*e53c461bSKonstantin Varlamov   }
56*e53c461bSKonstantin Varlamov 
57*e53c461bSKonstantin Varlamov   // `non-propagating-cache` is not copied.
58*e53c461bSKonstantin Varlamov   {
59*e53c461bSKonstantin Varlamov     SplitViewInput v1("abc def ghi", ' ');
60*e53c461bSKonstantin Varlamov     auto outer_iter1 = v1.begin();
61*e53c461bSKonstantin Varlamov     ++outer_iter1;
62*e53c461bSKonstantin Varlamov     auto val1 = *outer_iter1;
63*e53c461bSKonstantin Varlamov     auto i1 = val1.begin();
64*e53c461bSKonstantin Varlamov     assert(*i1 == 'd');
65*e53c461bSKonstantin Varlamov     ++i1;
66*e53c461bSKonstantin Varlamov     assert(*i1 == 'e');
67*e53c461bSKonstantin Varlamov 
68*e53c461bSKonstantin Varlamov     auto v2 = v1;
69*e53c461bSKonstantin Varlamov     auto val2 = *v2.begin();
70*e53c461bSKonstantin Varlamov     auto i2 = val2.begin();
71*e53c461bSKonstantin Varlamov     assert(*i2 == 'a');
72*e53c461bSKonstantin Varlamov     ++i2;
73*e53c461bSKonstantin Varlamov     assert(*i2 == 'b');
74*e53c461bSKonstantin Varlamov   }
75*e53c461bSKonstantin Varlamov 
76*e53c461bSKonstantin Varlamov   return true;
77*e53c461bSKonstantin Varlamov }
78*e53c461bSKonstantin Varlamov 
main(int,char **)79*e53c461bSKonstantin Varlamov int main(int, char**) {
80*e53c461bSKonstantin Varlamov   test();
81*e53c461bSKonstantin Varlamov   static_assert(test());
82*e53c461bSKonstantin Varlamov 
83*e53c461bSKonstantin Varlamov   return 0;
84*e53c461bSKonstantin Varlamov }
85