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