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