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