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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
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

source code of libcxx/test/std/ranges/range.req/range.sized/sized_range.compile.pass.cpp