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