1065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===// 2065dc485SJakub Mazurkiewicz // 3065dc485SJakub Mazurkiewicz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4065dc485SJakub Mazurkiewicz // See https://llvm.org/LICENSE.txt for license information. 5065dc485SJakub Mazurkiewicz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6065dc485SJakub Mazurkiewicz // 7065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===// 8065dc485SJakub Mazurkiewicz 9065dc485SJakub Mazurkiewicz // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 10065dc485SJakub Mazurkiewicz 11065dc485SJakub Mazurkiewicz // <ranges> 12065dc485SJakub Mazurkiewicz 13065dc485SJakub Mazurkiewicz // chunk_by_view() requires std::default_initializable<View> && 14065dc485SJakub Mazurkiewicz // std::default_initializable<Pred> = default; 15065dc485SJakub Mazurkiewicz 16065dc485SJakub Mazurkiewicz #include <ranges> 17065dc485SJakub Mazurkiewicz 18065dc485SJakub Mazurkiewicz #include <cassert> 19*e99c4906SNikolas Klauser #include <cstddef> 20065dc485SJakub Mazurkiewicz #include <type_traits> 21065dc485SJakub Mazurkiewicz 22065dc485SJakub Mazurkiewicz constexpr int buff[] = {-2, 1, -1, 2}; 23065dc485SJakub Mazurkiewicz 24065dc485SJakub Mazurkiewicz struct DefaultConstructibleView : std::ranges::view_base { 25065dc485SJakub Mazurkiewicz DefaultConstructibleView() = default; 26065dc485SJakub Mazurkiewicz constexpr int const* begin() const { return buff; } 27065dc485SJakub Mazurkiewicz constexpr int const* end() const { return buff + 4; } 28065dc485SJakub Mazurkiewicz }; 29065dc485SJakub Mazurkiewicz 30065dc485SJakub Mazurkiewicz struct DefaultConstructiblePredicate { 31065dc485SJakub Mazurkiewicz DefaultConstructiblePredicate() = default; 32065dc485SJakub Mazurkiewicz constexpr bool operator()(int x, int y) const { return x != -y; } 33065dc485SJakub Mazurkiewicz }; 34065dc485SJakub Mazurkiewicz 35065dc485SJakub Mazurkiewicz struct NoDefaultView : std::ranges::view_base { 36065dc485SJakub Mazurkiewicz NoDefaultView() = delete; 37065dc485SJakub Mazurkiewicz int* begin() const; 38065dc485SJakub Mazurkiewicz int* end() const; 39065dc485SJakub Mazurkiewicz }; 40065dc485SJakub Mazurkiewicz 41065dc485SJakub Mazurkiewicz struct NoDefaultPredicate { 42065dc485SJakub Mazurkiewicz NoDefaultPredicate() = delete; 43065dc485SJakub Mazurkiewicz constexpr bool operator()(int, int) const; 44065dc485SJakub Mazurkiewicz }; 45065dc485SJakub Mazurkiewicz 46065dc485SJakub Mazurkiewicz struct NoexceptView : std::ranges::view_base { 47065dc485SJakub Mazurkiewicz NoexceptView() noexcept; 48065dc485SJakub Mazurkiewicz int const* begin() const; 49065dc485SJakub Mazurkiewicz int const* end() const; 50065dc485SJakub Mazurkiewicz }; 51065dc485SJakub Mazurkiewicz 52065dc485SJakub Mazurkiewicz struct NoexceptPredicate { 53065dc485SJakub Mazurkiewicz NoexceptPredicate() noexcept; 54065dc485SJakub Mazurkiewicz bool operator()(int, int) const; 55065dc485SJakub Mazurkiewicz }; 56065dc485SJakub Mazurkiewicz 57065dc485SJakub Mazurkiewicz struct MayThrowView : std::ranges::view_base { 58065dc485SJakub Mazurkiewicz MayThrowView() noexcept(false); 59065dc485SJakub Mazurkiewicz int const* begin() const; 60065dc485SJakub Mazurkiewicz int const* end() const; 61065dc485SJakub Mazurkiewicz }; 62065dc485SJakub Mazurkiewicz 63065dc485SJakub Mazurkiewicz struct MayThrowPredicate { 64065dc485SJakub Mazurkiewicz MayThrowPredicate() noexcept(false); 65065dc485SJakub Mazurkiewicz bool operator()(int, int) const; 66065dc485SJakub Mazurkiewicz }; 67065dc485SJakub Mazurkiewicz 68065dc485SJakub Mazurkiewicz constexpr void compareRanges(std::ranges::subrange<const int*> v, std::initializer_list<int> list) { 69065dc485SJakub Mazurkiewicz assert(v.size() == list.size()); 70065dc485SJakub Mazurkiewicz for (size_t i = 0; i < v.size(); ++i) { 71065dc485SJakub Mazurkiewicz assert(v[i] == list.begin()[i]); 72065dc485SJakub Mazurkiewicz } 73065dc485SJakub Mazurkiewicz } 74065dc485SJakub Mazurkiewicz 75065dc485SJakub Mazurkiewicz constexpr bool test() { 76065dc485SJakub Mazurkiewicz // Check default constructor with default initialization 77065dc485SJakub Mazurkiewicz { 78065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<DefaultConstructibleView, DefaultConstructiblePredicate>; 79065dc485SJakub Mazurkiewicz View view; 80065dc485SJakub Mazurkiewicz auto it = view.begin(), end = view.end(); 81065dc485SJakub Mazurkiewicz compareRanges(*it++, {-2, 1}); 82065dc485SJakub Mazurkiewicz compareRanges(*it++, {-1, 2}); 83065dc485SJakub Mazurkiewicz assert(it == end); 84065dc485SJakub Mazurkiewicz } 85065dc485SJakub Mazurkiewicz 86065dc485SJakub Mazurkiewicz // Check default construction with copy-list-initialization 87065dc485SJakub Mazurkiewicz { 88065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<DefaultConstructibleView, DefaultConstructiblePredicate>; 89065dc485SJakub Mazurkiewicz View view = {}; 90065dc485SJakub Mazurkiewicz auto it = view.begin(), end = view.end(); 91065dc485SJakub Mazurkiewicz compareRanges(*it++, {-2, 1}); 92065dc485SJakub Mazurkiewicz compareRanges(*it++, {-1, 2}); 93065dc485SJakub Mazurkiewicz assert(it == end); 94065dc485SJakub Mazurkiewicz } 95065dc485SJakub Mazurkiewicz 96065dc485SJakub Mazurkiewicz // Check cases where the default constructor isn't provided 97065dc485SJakub Mazurkiewicz { 98065dc485SJakub Mazurkiewicz static_assert( 99065dc485SJakub Mazurkiewicz !std::is_default_constructible_v<std::ranges::chunk_by_view<NoDefaultView, DefaultConstructiblePredicate>>); 100065dc485SJakub Mazurkiewicz static_assert( 101065dc485SJakub Mazurkiewicz !std::is_default_constructible_v<std::ranges::chunk_by_view<DefaultConstructibleView, NoDefaultPredicate>>); 102065dc485SJakub Mazurkiewicz static_assert(!std::is_default_constructible_v<std::ranges::chunk_by_view<NoDefaultView, NoDefaultPredicate>>); 103065dc485SJakub Mazurkiewicz } 104065dc485SJakub Mazurkiewicz 105065dc485SJakub Mazurkiewicz // Check noexcept-ness 106065dc485SJakub Mazurkiewicz { 107065dc485SJakub Mazurkiewicz { 108065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<MayThrowView, MayThrowPredicate>; 109065dc485SJakub Mazurkiewicz static_assert(!noexcept(View())); 110065dc485SJakub Mazurkiewicz } 111065dc485SJakub Mazurkiewicz { 112065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<MayThrowView, NoexceptPredicate>; 113065dc485SJakub Mazurkiewicz static_assert(!noexcept(View())); 114065dc485SJakub Mazurkiewicz } 115065dc485SJakub Mazurkiewicz { 116065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<NoexceptView, MayThrowPredicate>; 117065dc485SJakub Mazurkiewicz static_assert(!noexcept(View())); 118065dc485SJakub Mazurkiewicz } 119065dc485SJakub Mazurkiewicz { 120065dc485SJakub Mazurkiewicz using View = std::ranges::chunk_by_view<NoexceptView, NoexceptPredicate>; 121065dc485SJakub Mazurkiewicz static_assert(noexcept(View())); 122065dc485SJakub Mazurkiewicz } 123065dc485SJakub Mazurkiewicz } 124065dc485SJakub Mazurkiewicz 125065dc485SJakub Mazurkiewicz return true; 126065dc485SJakub Mazurkiewicz } 127065dc485SJakub Mazurkiewicz 128065dc485SJakub Mazurkiewicz int main(int, char**) { 129065dc485SJakub Mazurkiewicz test(); 130065dc485SJakub Mazurkiewicz static_assert(test()); 131065dc485SJakub Mazurkiewicz 132065dc485SJakub Mazurkiewicz return 0; 133065dc485SJakub Mazurkiewicz } 134