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