78 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// template<class T>12// concept sized_range;13 14#include <ranges>15 16#include "test_iterators.h"17 18 19 20static_assert(std::ranges::sized_range<int[5]>);21static_assert(std::ranges::sized_range<int (&)[5]>);22static_assert(!std::ranges::sized_range<int (&)[]>);23static_assert(!std::ranges::sized_range<int[]>);24 25struct range_has_size {26 bidirectional_iterator<int*> begin();27 bidirectional_iterator<int*> end();28 int size();29};30static_assert(std::ranges::sized_range<range_has_size>);31static_assert(!std::ranges::sized_range<range_has_size const>);32 33struct range_has_const_size {34 bidirectional_iterator<int*> begin();35 bidirectional_iterator<int*> end();36 int size() const;37};38static_assert(std::ranges::sized_range<range_has_const_size>);39static_assert(!std::ranges::sized_range<range_has_const_size const>);40 41struct const_range_has_size {42 bidirectional_iterator<int*> begin() const;43 bidirectional_iterator<int*> end() const;44 int size();45};46static_assert(std::ranges::sized_range<const_range_has_size>);47static_assert(std::ranges::range<const_range_has_size const>);48static_assert(!std::ranges::sized_range<const_range_has_size const>);49 50struct const_range_has_const_size {51 bidirectional_iterator<int*> begin() const;52 bidirectional_iterator<int*> end() const;53 int size() const;54};55static_assert(std::ranges::sized_range<const_range_has_const_size>);56static_assert(std::ranges::sized_range<const_range_has_const_size const>);57 58struct sized_sentinel_range_has_size {59 int* begin();60 int* end();61};62static_assert(std::ranges::sized_range<sized_sentinel_range_has_size>);63static_assert(!std::ranges::sized_range<sized_sentinel_range_has_size const>);64 65struct const_sized_sentinel_range_has_size {66 int* begin() const;67 int* end() const;68};69static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size>);70static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size const>);71 72struct non_range_has_size {73 int size() const;74};75static_assert(requires(non_range_has_size const x) { std::ranges::size(x); });76static_assert(!std::ranges::sized_range<non_range_has_size>);77static_assert(!std::ranges::sized_range<non_range_has_size const>);78