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: libcpp-has-no-incomplete-ranges 12 13 // constexpr auto size() requires sized_range<V> 14 // constexpr auto size() const requires sized_range<const V> 15 16 #include <ranges> 17 #include <cassert> 18 19 #include "test_macros.h" 20 #include "test_iterators.h" 21 #include "test_range.h" 22 #include "types.h" 23 24 template<class T> 25 concept SizeEnabled = requires(const std::ranges::take_view<T>& tv) { 26 tv.size(); 27 }; 28 29 constexpr bool test() { 30 int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; 31 32 { 33 static_assert( SizeEnabled<SizedRandomAccessView>); 34 static_assert(!SizeEnabled<CopyableView>); 35 } 36 37 { 38 std::ranges::take_view<SizedRandomAccessView> tv(SizedRandomAccessView{buffer}, 0); 39 assert(tv.size() == 0); 40 } 41 42 { 43 const std::ranges::take_view<SizedRandomAccessView> tv(SizedRandomAccessView{buffer}, 2); 44 assert(tv.size() == 2); 45 } 46 47 { 48 std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 4); 49 assert(tv.size() == 4); 50 } 51 52 { 53 const std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 6); 54 assert(tv.size() == 6); 55 } 56 57 { 58 std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 8); 59 assert(tv.size() == 8); 60 } 61 { 62 const std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 8); 63 assert(tv.size() == 8); 64 } 65 66 { 67 std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 10); 68 assert(tv.size() == 8); 69 } 70 { 71 const std::ranges::take_view<SizedForwardView> tv(SizedForwardView{buffer}, 10); 72 assert(tv.size() == 8); 73 } 74 75 return true; 76 } 77 78 int main(int, char**) { 79 test(); 80 static_assert(test()); 81 82 return 0; 83 } 84