mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 20:46:05 +00:00

Reviewed By: var-const, Mordante, ldionne, #libc Spies: tcanens, libcxx-commits, mgorny Differential Revision: https://reviews.llvm.org/D121523
190 lines
8.6 KiB
C++
190 lines
8.6 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
|
|
// UNSUPPORTED: libcpp-has-no-incomplete-ranges
|
|
// REQUIRES: stdlib=libc++
|
|
|
|
// [algorithms.requirements]/2
|
|
// [range.iter.ops.general]/2
|
|
|
|
#include <algorithm>
|
|
#include <concepts>
|
|
#include <iterator>
|
|
#include <memory>
|
|
#include <random>
|
|
#include <ranges>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
// Niebloids, unlike CPOs, are *not* required to be semiregular or even to have
|
|
// a declared type at all; they are specified as "magic" overload sets whose
|
|
// names are not found by argument-dependent lookup and which inhibit
|
|
// argument-dependent lookup if they are found via a `using`-declaration.
|
|
//
|
|
// libc++ implements them using the same function-object technique we use for CPOs;
|
|
// therefore this file should stay in sync with ./cpo.compile.pass.cpp.
|
|
|
|
template <class CPO, class... Args>
|
|
constexpr bool test(CPO& o, Args&&...) {
|
|
static_assert(std::is_const_v<CPO>);
|
|
static_assert(std::is_class_v<CPO>);
|
|
static_assert(std::is_trivial_v<CPO>);
|
|
|
|
auto p = o;
|
|
using T = decltype(p);
|
|
|
|
// The type of a customization point object, ignoring cv-qualifiers, shall model semiregular.
|
|
static_assert(std::semiregular<T>);
|
|
|
|
// The type T of a customization point object, ignoring cv-qualifiers, shall model...
|
|
static_assert(std::invocable<T&, Args...>);
|
|
static_assert(std::invocable<const T&, Args...>);
|
|
static_assert(std::invocable<T, Args...>);
|
|
static_assert(std::invocable<const T, Args...>);
|
|
|
|
return true;
|
|
}
|
|
|
|
int *p;
|
|
int a[10];
|
|
auto odd = [](int x) { return x % 2 != 0; };
|
|
//auto triple = [](int x) { return 3*x; };
|
|
//auto plus = [](int x, int y) { return x == y; };
|
|
//std::mt19937 g;
|
|
|
|
// [algorithm.syn]
|
|
|
|
//static_assert(test(std::ranges::adjacent_find, a));
|
|
//static_assert(test(std::ranges::all_of, a, odd));
|
|
//static_assert(test(std::ranges::any_of, a, odd));
|
|
//static_assert(test(std::ranges::binary_search, a, 42));
|
|
//static_assert(test(std::ranges::clamp, 42, 42, 42));
|
|
//static_assert(test(std::ranges::copy, a, a));
|
|
//static_assert(test(std::ranges::copy_backward, a, a));
|
|
//static_assert(test(std::ranges::copy_if, a, a, odd));
|
|
//static_assert(test(std::ranges::copy_n, a, 10, a));
|
|
static_assert(test(std::ranges::count, a, 42));
|
|
static_assert(test(std::ranges::count_if, a, odd));
|
|
//static_assert(test(std::ranges::ends_with, a, a));
|
|
//static_assert(test(std::ranges::equal, a, a));
|
|
//static_assert(test(std::ranges::equal_range, a, 42));
|
|
//static_assert(test(std::ranges::fill, a, 42));
|
|
//static_assert(test(std::ranges::fill_n, a, 10, 42));
|
|
static_assert(test(std::ranges::find, a, 42));
|
|
//static_assert(test(std::ranges::find_end, a, a));
|
|
//static_assert(test(std::ranges::find_first_of, a, a));
|
|
static_assert(test(std::ranges::find_if, a, odd));
|
|
static_assert(test(std::ranges::find_if_not, a, odd));
|
|
//static_assert(test(std::ranges::for_each, a, odd));
|
|
//static_assert(test(std::ranges::for_each_n, a, 10, odd));
|
|
//static_assert(test(std::ranges::generate, a, 42));
|
|
//static_assert(test(std::ranges::generate_n, a, 10, 42));
|
|
//static_assert(test(std::ranges::includes, a, a));
|
|
//static_assert(test(std::ranges::inplace_merge, a, a+5));
|
|
//static_assert(test(std::ranges::is_heap, a));
|
|
//static_assert(test(std::ranges::is_heap_until, a));
|
|
//static_assert(test(std::ranges::is_partitioned, a, odd));
|
|
//static_assert(test(std::ranges::is_permutation, a, a));
|
|
//static_assert(test(std::ranges::is_sorted, a));
|
|
//static_assert(test(std::ranges::is_sorted_until, a));
|
|
//static_assert(test(std::ranges::lexicographical_compare, a, a));
|
|
//static_assert(test(std::ranges::lower_bound, a, 42));
|
|
//static_assert(test(std::ranges::make_heap, a));
|
|
//static_assert(test(std::ranges::max, a));
|
|
static_assert(test(std::ranges::max_element, a));
|
|
//static_assert(test(std::ranges::merge, a, a, a));
|
|
static_assert(test(std::ranges::min, a));
|
|
static_assert(test(std::ranges::min_element, a));
|
|
//static_assert(test(std::ranges::minmax, a));
|
|
//static_assert(test(std::ranges::minmax_element, a));
|
|
static_assert(test(std::ranges::mismatch, a, a));
|
|
//static_assert(test(std::ranges::move, a, a));
|
|
//static_assert(test(std::ranges::move_backward, a, a));
|
|
//static_assert(test(std::ranges::next_permutation, a));
|
|
//static_assert(test(std::ranges::none_of, a, odd));
|
|
//static_assert(test(std::ranges::nth_element, a, a+5));
|
|
//static_assert(test(std::ranges::partial_sort, a, a+5));
|
|
//static_assert(test(std::ranges::partial_sort_copy, a, a));
|
|
//static_assert(test(std::ranges::partition, a, odd));
|
|
//static_assert(test(std::ranges::partition_copy, a, a, a, odd));
|
|
//static_assert(test(std::ranges::partition_point, a, odd));
|
|
//static_assert(test(std::ranges::pop_heap, a));
|
|
//static_assert(test(std::ranges::prev_permutation, a));
|
|
//static_assert(test(std::ranges::push_heap, a));
|
|
//static_assert(test(std::ranges::remove, a, 42));
|
|
//static_assert(test(std::ranges::remove_copy, a, a, 42));
|
|
//static_assert(test(std::ranges::remove_copy_if, a, a, odd));
|
|
//static_assert(test(std::ranges::remove_if, a, odd));
|
|
//static_assert(test(std::ranges::replace, a, 42, 43));
|
|
//static_assert(test(std::ranges::replace_copy, a, a, 42, 43));
|
|
//static_assert(test(std::ranges::replace_copy_if, a, a, odd, 43));
|
|
//static_assert(test(std::ranges::replace_if, a, odd, 43));
|
|
//static_assert(test(std::ranges::reverse, a));
|
|
//static_assert(test(std::ranges::reverse_copy, a, a));
|
|
//static_assert(test(std::ranges::rotate, a, a+5));
|
|
//static_assert(test(std::ranges::rotate_copy, a, a+5, a));
|
|
//static_assert(test(std::ranges::sample, a, a, 5));
|
|
//static_assert(test(std::ranges::search, a, a));
|
|
//static_assert(test(std::ranges::search_n, a, 10, 42));
|
|
//static_assert(test(std::ranges::set_difference, a, a, a));
|
|
//static_assert(test(std::ranges::set_intersection, a, a, a));
|
|
//static_assert(test(std::ranges::set_symmetric_difference, a, a, a));
|
|
//static_assert(test(std::ranges::set_union, a, a, a));
|
|
//static_assert(test(std::ranges::shuffle, a, g));
|
|
//static_assert(test(std::ranges::sort, a));
|
|
//static_assert(test(std::ranges::sort_heap, a));
|
|
//static_assert(test(std::ranges::stable_partition, a, odd));
|
|
//static_assert(test(std::ranges::stable_sort, a));
|
|
//static_assert(test(std::ranges::starts_with, a, a));
|
|
static_assert(test(std::ranges::swap_ranges, a, a));
|
|
//static_assert(test(std::ranges::transform, a, a, triple));
|
|
//static_assert(test(std::ranges::unique, a));
|
|
//static_assert(test(std::ranges::unique_copy, a, a));
|
|
//static_assert(test(std::ranges::upper_bound, a, 42));
|
|
|
|
// [memory.syn]
|
|
|
|
static_assert(test(std::ranges::construct_at, a, 42));
|
|
static_assert(test(std::ranges::destroy, a));
|
|
static_assert(test(std::ranges::destroy, a, a+10));
|
|
static_assert(test(std::ranges::destroy_at, a));
|
|
static_assert(test(std::ranges::destroy_n, a, 10));
|
|
static_assert(test(std::ranges::uninitialized_copy, a, a));
|
|
static_assert(test(std::ranges::uninitialized_copy, a, a+10, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_copy_n, a, 10, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_default_construct, a));
|
|
static_assert(test(std::ranges::uninitialized_default_construct, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_default_construct_n, a, 10));
|
|
static_assert(test(std::ranges::uninitialized_fill, a, 42));
|
|
static_assert(test(std::ranges::uninitialized_fill, a, a+10, 42));
|
|
static_assert(test(std::ranges::uninitialized_fill_n, a, 10, 42));
|
|
static_assert(test(std::ranges::uninitialized_move, a, a));
|
|
static_assert(test(std::ranges::uninitialized_move, a, a+10, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_move_n, a, 10, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_value_construct, a));
|
|
static_assert(test(std::ranges::uninitialized_value_construct, a, a+10));
|
|
static_assert(test(std::ranges::uninitialized_value_construct_n, a, 10));
|
|
|
|
// [numeric.ops.overview] currently has no ranges algorithms. See P1813, P2214
|
|
|
|
// [range.iter.ops]
|
|
|
|
static_assert(test(std::ranges::advance, p, 5));
|
|
static_assert(test(std::ranges::advance, p, 5, a+10));
|
|
static_assert(test(std::ranges::advance, p, a+10));
|
|
static_assert(test(std::ranges::distance, a));
|
|
static_assert(test(std::ranges::distance, a, a+10));
|
|
static_assert(test(std::ranges::next, a));
|
|
static_assert(test(std::ranges::next, a, 5));
|
|
static_assert(test(std::ranges::next, a, 5, a+10));
|
|
static_assert(test(std::ranges::next, a, a+10));
|
|
static_assert(test(std::ranges::prev, a+10));
|
|
static_assert(test(std::ranges::prev, a+10, 5));
|
|
static_assert(test(std::ranges::prev, a+10, 5, a));
|