xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.chunk.by/constraints.compile.pass.cpp (revision 065dc485bd4b33f6110993cc4b353f1e7c36cac3)
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