1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges 11 12 // Test the implicitly-generated copy and move constructors since `lazy_split_view` has non-trivial members. 13 14 #include <ranges> 15 16 #include <cassert> 17 #include <string_view> 18 #include <utility> 19 #include "types.h" 20 21 constexpr bool test() { 22 // Can copy `lazy_split_view`. 23 { 24 // Forward range. 25 { 26 std::ranges::lazy_split_view<std::string_view, std::string_view> v1("abc def", " "); 27 auto v2 = v1; 28 assert(v2.base() == v1.base()); 29 } 30 31 // Input range. 32 { 33 SplitViewInput v1("abc def", ' '); 34 auto v2 = v1; 35 assert(v2.base() == v1.base()); 36 } 37 } 38 39 // Can move `lazy_split_view`. 40 { 41 // Forward range. 42 { 43 std::string_view base = "abc def"; 44 std::ranges::lazy_split_view<std::string_view, std::string_view> v1(base, " "); 45 auto v2 = std::move(v1); 46 assert(v2.base() == base); 47 } 48 49 // Input range. 50 { 51 InputView base("abc def"); 52 SplitViewInput v1(base, ' '); 53 auto v2 = std::move(v1); 54 assert(v2.base() == base); 55 } 56 } 57 58 // `non-propagating-cache` is not copied. 59 { 60 SplitViewInput v1("abc def ghi", ' '); 61 auto outer_iter1 = v1.begin(); 62 ++outer_iter1; 63 auto val1 = *outer_iter1; 64 auto i1 = val1.begin(); 65 assert(*i1 == 'd'); 66 ++i1; 67 assert(*i1 == 'e'); 68 69 auto v2 = v1; 70 auto val2 = *v2.begin(); 71 auto i2 = val2.begin(); 72 assert(*i2 == 'a'); 73 ++i2; 74 assert(*i2 == 'b'); 75 } 76 77 return true; 78 } 79 80 int main(int, char**) { 81 test(); 82 static_assert(test()); 83 84 return 0; 85 } 86