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 // constexpr auto begin(); 13 // constexpr auto begin() const; 14 15 #include <cassert> 16 #include <ranges> 17 18 #include "test_macros.h" 19 #include "types.h" 20 21 struct NonSimpleParentView : std::ranges::view_base { 22 ChildView* begin() { return nullptr; } 23 const ChildView* begin() const; 24 const ChildView* end() const; 25 }; 26 27 struct SimpleParentView : std::ranges::view_base { 28 const ChildView* begin() const; 29 const ChildView* end() const; 30 }; 31 32 constexpr bool test() { 33 int buffer[4][4] = {{1111, 2222, 3333, 4444}, {555, 666, 777, 888}, {99, 1010, 1111, 1212}, {13, 14, 15, 16}}; 34 35 { 36 ChildView children[4] = {ChildView(buffer[0]), ChildView(buffer[1]), ChildView(buffer[2]), ChildView(buffer[3])}; 37 auto jv = std::ranges::join_view(ParentView{children}); 38 assert(*jv.begin() == 1111); 39 } 40 41 { 42 CopyableChild children[4] = {CopyableChild(buffer[0], 4), CopyableChild(buffer[1], 0), CopyableChild(buffer[2], 1), CopyableChild(buffer[3], 0)}; 43 auto jv = std::ranges::join_view(ParentView{children}); 44 assert(*jv.begin() == 1111); 45 } 46 // Parent is empty. 47 { 48 CopyableChild children[4] = {CopyableChild(buffer[0]), CopyableChild(buffer[1]), CopyableChild(buffer[2]), CopyableChild(buffer[3])}; 49 std::ranges::join_view jv(ParentView(children, 0)); 50 assert(jv.begin() == jv.end()); 51 } 52 // Parent size is one. 53 { 54 CopyableChild children[1] = {CopyableChild(buffer[0])}; 55 std::ranges::join_view jv(ParentView(children, 1)); 56 assert(*jv.begin() == 1111); 57 } 58 // Parent and child size is one. 59 { 60 CopyableChild children[1] = {CopyableChild(buffer[0], 1)}; 61 std::ranges::join_view jv(ParentView(children, 1)); 62 assert(*jv.begin() == 1111); 63 } 64 // Parent size is one child is empty 65 { 66 CopyableChild children[1] = {CopyableChild(buffer[0], 0)}; 67 std::ranges::join_view jv(ParentView(children, 1)); 68 assert(jv.begin() == jv.end()); 69 } 70 // Has all empty children. 71 { 72 CopyableChild children[4] = {CopyableChild(buffer[0], 0), CopyableChild(buffer[1], 0), CopyableChild(buffer[2], 0), CopyableChild(buffer[3], 0)}; 73 auto jv = std::ranges::join_view(ParentView{children}); 74 assert(jv.begin() == jv.end()); 75 } 76 // First child is empty, others are not. 77 { 78 CopyableChild children[4] = {CopyableChild(buffer[0], 4), CopyableChild(buffer[1], 0), CopyableChild(buffer[2], 0), CopyableChild(buffer[3], 0)}; 79 auto jv = std::ranges::join_view(ParentView{children}); 80 assert(*jv.begin() == 1111); 81 } 82 // Last child is empty, others are not. 83 { 84 CopyableChild children[4] = {CopyableChild(buffer[0], 4), CopyableChild(buffer[1], 4), CopyableChild(buffer[2], 4), CopyableChild(buffer[3], 0)}; 85 auto jv = std::ranges::join_view(ParentView{children}); 86 assert(*jv.begin() == 1111); 87 } 88 89 { 90 std::ranges::join_view jv(buffer); 91 assert(*jv.begin() == 1111); 92 } 93 94 { 95 const std::ranges::join_view jv(buffer); 96 assert(*jv.begin() == 1111); 97 } 98 99 // !simple-view<V> 100 { 101 std::ranges::join_view<NonSimpleParentView> jv; 102 static_assert(!std::same_as<decltype(jv.begin()), 103 decltype(std::as_const(jv).begin())>); 104 } 105 106 // simple-view<V> && is_reference_v<range_reference_t<V>>; 107 { 108 std::ranges::join_view<SimpleParentView> jv; 109 static_assert(std::same_as<decltype(jv.begin()), 110 decltype(std::as_const(jv).begin())>); 111 } 112 113 return true; 114 } 115 116 int main(int, char**) { 117 test(); 118 static_assert(test()); 119 120 return 0; 121 } 122