1d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===// 2d8fad661SChristopher Di Bella // 3d8fad661SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d8fad661SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information. 5d8fad661SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d8fad661SChristopher Di Bella // 7d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===// 8d8fad661SChristopher Di Bella 9d8fad661SChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17 10d8fad661SChristopher Di Bella 11d8fad661SChristopher Di Bella // template<class T> 12d8fad661SChristopher Di Bella // concept sized_range; 13d8fad661SChristopher Di Bella 14d8fad661SChristopher Di Bella #include <ranges> 15d8fad661SChristopher Di Bella 16d8fad661SChristopher Di Bella #include "test_iterators.h" 17d8fad661SChristopher Di Bella 18d8fad661SChristopher Di Bella 19*9d7c420aSLouis Dionne 20*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<int[5]>); 21*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<int (&)[5]>); 22*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<int (&)[]>); 23*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<int[]>); 24d8fad661SChristopher Di Bella 25d8fad661SChristopher Di Bella struct range_has_size { 26d8fad661SChristopher Di Bella bidirectional_iterator<int*> begin(); 27d8fad661SChristopher Di Bella bidirectional_iterator<int*> end(); 28d8fad661SChristopher Di Bella int size(); 29d8fad661SChristopher Di Bella }; 30*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<range_has_size>); 31*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<range_has_size const>); 32d8fad661SChristopher Di Bella 33d8fad661SChristopher Di Bella struct range_has_const_size { 34d8fad661SChristopher Di Bella bidirectional_iterator<int*> begin(); 35d8fad661SChristopher Di Bella bidirectional_iterator<int*> end(); 36d8fad661SChristopher Di Bella int size() const; 37d8fad661SChristopher Di Bella }; 38*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<range_has_const_size>); 39*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<range_has_const_size const>); 40d8fad661SChristopher Di Bella 41d8fad661SChristopher Di Bella struct const_range_has_size { 42d8fad661SChristopher Di Bella bidirectional_iterator<int*> begin() const; 43d8fad661SChristopher Di Bella bidirectional_iterator<int*> end() const; 44d8fad661SChristopher Di Bella int size(); 45d8fad661SChristopher Di Bella }; 46*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<const_range_has_size>); 47*9d7c420aSLouis Dionne static_assert(std::ranges::range<const_range_has_size const>); 48*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<const_range_has_size const>); 49d8fad661SChristopher Di Bella 50d8fad661SChristopher Di Bella struct const_range_has_const_size { 51d8fad661SChristopher Di Bella bidirectional_iterator<int*> begin() const; 52d8fad661SChristopher Di Bella bidirectional_iterator<int*> end() const; 53d8fad661SChristopher Di Bella int size() const; 54d8fad661SChristopher Di Bella }; 55*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<const_range_has_const_size>); 56*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<const_range_has_const_size const>); 57d8fad661SChristopher Di Bella 58d8fad661SChristopher Di Bella struct sized_sentinel_range_has_size { 59d8fad661SChristopher Di Bella int* begin(); 60d8fad661SChristopher Di Bella int* end(); 61d8fad661SChristopher Di Bella }; 62*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<sized_sentinel_range_has_size>); 63*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<sized_sentinel_range_has_size const>); 64d8fad661SChristopher Di Bella 65d8fad661SChristopher Di Bella struct const_sized_sentinel_range_has_size { 66d8fad661SChristopher Di Bella int* begin() const; 67d8fad661SChristopher Di Bella int* end() const; 68d8fad661SChristopher Di Bella }; 69*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size>); 70*9d7c420aSLouis Dionne static_assert(std::ranges::sized_range<const_sized_sentinel_range_has_size const>); 71d8fad661SChristopher Di Bella 72d8fad661SChristopher Di Bella struct non_range_has_size { 73d8fad661SChristopher Di Bella int size() const; 74d8fad661SChristopher Di Bella }; 75*9d7c420aSLouis Dionne static_assert(requires(non_range_has_size const x) { std::ranges::size(x); }); 76*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<non_range_has_size>); 77*9d7c420aSLouis Dionne static_assert(!std::ranges::sized_range<non_range_has_size const>); 78