This patch implements https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2443r1.html (`views::chunk_by`). Reviewed By: #libc, var-const Differential Revision: https://reviews.llvm.org/D144767
122 lines
3.7 KiB
C++
122 lines
3.7 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|