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