xref: /llvm-project/libcxx/test/std/ranges/range.req/range.sized/sized_range.compile.pass.cpp (revision d2baefae6846765eef6a6dd69d4fdf1082ce29ad)
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 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11 
12 // template<class T>
13 // concept sized_range;
14 
15 #include <ranges>
16 
17 #include "test_iterators.h"
18 
19 
20 
21 static_assert(std::ranges::sized_range<int[5]>);
22 static_assert(std::ranges::sized_range<int (&)[5]>);
23 static_assert(!std::ranges::sized_range<int (&)[]>);
24 static_assert(!std::ranges::sized_range<int[]>);
25 
26 struct range_has_size {
27   bidirectional_iterator<int*> begin();
28   bidirectional_iterator<int*> end();
29   int size();
30 };
31 static_assert(std::ranges::sized_range<range_has_size>);
32 static_assert(!std::ranges::sized_range<range_has_size const>);
33 
34 struct range_has_const_size {
35   bidirectional_iterator<int*> begin();
36   bidirectional_iterator<int*> end();
37   int size() const;
38 };
39 static_assert(std::ranges::sized_range<range_has_const_size>);
40 static_assert(!std::ranges::sized_range<range_has_const_size const>);
41 
42 struct const_range_has_size {
43   bidirectional_iterator<int*> begin() const;
44   bidirectional_iterator<int*> end() const;
45   int size();
46 };
47 static_assert(std::ranges::sized_range<const_range_has_size>);
48 static_assert(std::ranges::range<const_range_has_size const>);
49 static_assert(!std::ranges::sized_range<const_range_has_size const>);
50 
51 struct const_range_has_const_size {
52   bidirectional_iterator<int*> begin() const;
53   bidirectional_iterator<int*> end() const;
54   int size() const;
55 };
56 static_assert(std::ranges::sized_range<const_range_has_const_size>);
57 static_assert(std::ranges::sized_range<const_range_has_const_size const>);
58 
59 struct sized_sentinel_range_has_size {
60   int* begin();
61   int* end();
62 };
63 static_assert(std::ranges::sized_range<sized_sentinel_range_has_size>);
64 static_assert(!std::ranges::sized_range<sized_sentinel_range_has_size const>);
65 
66 struct const_sized_sentinel_range_has_size {
67   int* begin() const;
68   int* end() const;
69 };
70 static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size>);
71 static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size const>);
72 
73 struct non_range_has_size {
74   int size() const;
75 };
76 static_assert(requires(non_range_has_size const x) { std::ranges::size(x); });
77 static_assert(!std::ranges::sized_range<non_range_has_size>);
78 static_assert(!std::ranges::sized_range<non_range_has_size const>);
79