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