1*065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===// 2*065dc485SJakub Mazurkiewicz // 3*065dc485SJakub Mazurkiewicz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*065dc485SJakub Mazurkiewicz // See https://llvm.org/LICENSE.txt for license information. 5*065dc485SJakub Mazurkiewicz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*065dc485SJakub Mazurkiewicz // 7*065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===// 8*065dc485SJakub Mazurkiewicz 9*065dc485SJakub Mazurkiewicz // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 10*065dc485SJakub Mazurkiewicz 11*065dc485SJakub Mazurkiewicz // <ranges> 12*065dc485SJakub Mazurkiewicz 13*065dc485SJakub Mazurkiewicz // Check constraints on the type itself. 14*065dc485SJakub Mazurkiewicz // 15*065dc485SJakub Mazurkiewicz // template <forward_range View, indirect_binary_predicate<iterator_t<View>, iterator_t<View>> Pred> 16*065dc485SJakub Mazurkiewicz // requires view<View> && is_object_v<Pred> 17*065dc485SJakub Mazurkiewicz // class chunk_by_view; 18*065dc485SJakub Mazurkiewicz 19*065dc485SJakub Mazurkiewicz #include <ranges> 20*065dc485SJakub Mazurkiewicz 21*065dc485SJakub Mazurkiewicz #include <concepts> 22*065dc485SJakub Mazurkiewicz #include <cstddef> 23*065dc485SJakub Mazurkiewicz #include <iterator> 24*065dc485SJakub Mazurkiewicz #include <type_traits> 25*065dc485SJakub Mazurkiewicz 26*065dc485SJakub Mazurkiewicz #include "almost_satisfies_types.h" 27*065dc485SJakub Mazurkiewicz #include "test_iterators.h" 28*065dc485SJakub Mazurkiewicz 29*065dc485SJakub Mazurkiewicz template <class View, class Pred> 30*065dc485SJakub Mazurkiewicz concept CanFormChunkByView = requires { typename std::ranges::chunk_by_view<View, Pred>; }; 31*065dc485SJakub Mazurkiewicz 32*065dc485SJakub Mazurkiewicz // chunk_by_view is not valid when the view is not a forward_range 33*065dc485SJakub Mazurkiewicz namespace test_when_view_is_not_a_forward_range { 34*065dc485SJakub Mazurkiewicz 35*065dc485SJakub Mazurkiewicz struct View : std::ranges::view_base { 36*065dc485SJakub Mazurkiewicz ForwardIteratorNotDerivedFrom begin() const; 37*065dc485SJakub Mazurkiewicz ForwardIteratorNotDerivedFrom end() const; 38*065dc485SJakub Mazurkiewicz }; 39*065dc485SJakub Mazurkiewicz struct Pred { 40*065dc485SJakub Mazurkiewicz bool operator()(int, int) const; 41*065dc485SJakub Mazurkiewicz }; 42*065dc485SJakub Mazurkiewicz 43*065dc485SJakub Mazurkiewicz static_assert(!std::ranges::forward_range<View>); 44*065dc485SJakub Mazurkiewicz static_assert(std::indirect_binary_predicate<Pred, int*, int*>); 45*065dc485SJakub Mazurkiewicz static_assert(std::ranges::view<View>); 46*065dc485SJakub Mazurkiewicz static_assert(std::is_object_v<Pred>); 47*065dc485SJakub Mazurkiewicz static_assert(!CanFormChunkByView<View, Pred>); 48*065dc485SJakub Mazurkiewicz 49*065dc485SJakub Mazurkiewicz } // namespace test_when_view_is_not_a_forward_range 50*065dc485SJakub Mazurkiewicz 51*065dc485SJakub Mazurkiewicz // chunk_by_view is not valid when the predicate is not indirect_binary_predicate 52*065dc485SJakub Mazurkiewicz namespace test_when_the_predicate_is_not_indirect_binary_predicate { 53*065dc485SJakub Mazurkiewicz 54*065dc485SJakub Mazurkiewicz struct View : std::ranges::view_base { 55*065dc485SJakub Mazurkiewicz int* begin() const; 56*065dc485SJakub Mazurkiewicz int* end() const; 57*065dc485SJakub Mazurkiewicz }; 58*065dc485SJakub Mazurkiewicz struct Pred {}; 59*065dc485SJakub Mazurkiewicz 60*065dc485SJakub Mazurkiewicz static_assert(std::ranges::forward_range<View>); 61*065dc485SJakub Mazurkiewicz static_assert(!std::indirect_binary_predicate<Pred, int*, int*>); 62*065dc485SJakub Mazurkiewicz static_assert(std::ranges::view<View>); 63*065dc485SJakub Mazurkiewicz static_assert(std::is_object_v<Pred>); 64*065dc485SJakub Mazurkiewicz static_assert(!CanFormChunkByView<View, Pred>); 65*065dc485SJakub Mazurkiewicz 66*065dc485SJakub Mazurkiewicz } // namespace test_when_the_predicate_is_not_indirect_binary_predicate 67*065dc485SJakub Mazurkiewicz 68*065dc485SJakub Mazurkiewicz // chunk_by_view is not valid when the view is not a view 69*065dc485SJakub Mazurkiewicz namespace test_when_the_view_param_is_not_a_view { 70*065dc485SJakub Mazurkiewicz 71*065dc485SJakub Mazurkiewicz struct View { 72*065dc485SJakub Mazurkiewicz int* begin() const; 73*065dc485SJakub Mazurkiewicz int* end() const; 74*065dc485SJakub Mazurkiewicz }; 75*065dc485SJakub Mazurkiewicz struct Pred { 76*065dc485SJakub Mazurkiewicz bool operator()(int, int) const; 77*065dc485SJakub Mazurkiewicz }; 78*065dc485SJakub Mazurkiewicz 79*065dc485SJakub Mazurkiewicz static_assert(std::ranges::input_range<View>); 80*065dc485SJakub Mazurkiewicz static_assert(std::indirect_binary_predicate<Pred, int*, int*>); 81*065dc485SJakub Mazurkiewicz static_assert(!std::ranges::view<View>); 82*065dc485SJakub Mazurkiewicz static_assert(std::is_object_v<Pred>); 83*065dc485SJakub Mazurkiewicz static_assert(!CanFormChunkByView<View, Pred>); 84*065dc485SJakub Mazurkiewicz 85*065dc485SJakub Mazurkiewicz } // namespace test_when_the_view_param_is_not_a_view 86*065dc485SJakub Mazurkiewicz 87*065dc485SJakub Mazurkiewicz // chunk_by_view is not valid when the predicate is not an object type 88*065dc485SJakub Mazurkiewicz namespace test_when_the_predicate_is_not_an_object_type { 89*065dc485SJakub Mazurkiewicz 90*065dc485SJakub Mazurkiewicz struct View : std::ranges::view_base { 91*065dc485SJakub Mazurkiewicz int* begin() const; 92*065dc485SJakub Mazurkiewicz int* end() const; 93*065dc485SJakub Mazurkiewicz }; 94*065dc485SJakub Mazurkiewicz using Pred = bool (&)(int, int); 95*065dc485SJakub Mazurkiewicz 96*065dc485SJakub Mazurkiewicz static_assert(std::ranges::input_range<View>); 97*065dc485SJakub Mazurkiewicz static_assert(std::indirect_binary_predicate<Pred, int*, int*>); 98*065dc485SJakub Mazurkiewicz static_assert(std::ranges::view<View>); 99*065dc485SJakub Mazurkiewicz static_assert(!std::is_object_v<Pred>); 100*065dc485SJakub Mazurkiewicz static_assert(!CanFormChunkByView<View, Pred>); 101*065dc485SJakub Mazurkiewicz 102*065dc485SJakub Mazurkiewicz } // namespace test_when_the_predicate_is_not_an_object_type 103*065dc485SJakub Mazurkiewicz 104*065dc485SJakub Mazurkiewicz // chunk_by_view is valid when all the constraints are satisfied (test the test) 105*065dc485SJakub Mazurkiewicz namespace test_when_all_the_constraints_are_satisfied { 106*065dc485SJakub Mazurkiewicz 107*065dc485SJakub Mazurkiewicz struct View : std::ranges::view_base { 108*065dc485SJakub Mazurkiewicz int* begin() const; 109*065dc485SJakub Mazurkiewicz int* end() const; 110*065dc485SJakub Mazurkiewicz }; 111*065dc485SJakub Mazurkiewicz struct Pred { 112*065dc485SJakub Mazurkiewicz bool operator()(int, int) const; 113*065dc485SJakub Mazurkiewicz }; 114*065dc485SJakub Mazurkiewicz 115*065dc485SJakub Mazurkiewicz static_assert(std::ranges::input_range<View>); 116*065dc485SJakub Mazurkiewicz static_assert(std::indirect_binary_predicate<Pred, int*, int*>); 117*065dc485SJakub Mazurkiewicz static_assert(std::ranges::view<View>); 118*065dc485SJakub Mazurkiewicz static_assert(std::is_object_v<Pred>); 119*065dc485SJakub Mazurkiewicz static_assert(CanFormChunkByView<View, Pred>); 120*065dc485SJakub Mazurkiewicz 121*065dc485SJakub Mazurkiewicz } // namespace test_when_all_the_constraints_are_satisfied 122