xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.as.rvalue/size.pass.cpp (revision fb855eb941b6d740cc6560297d0b4d3201dcaf9f)
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 // constexpr auto size()
10 // constexpr auto size() const
11 
12 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
13 
14 #include <cassert>
15 #include <cstddef>
16 #include <ranges>
17 
18 struct ConstSizedView : std::ranges::view_base {
19   bool* size_called;
20   int* begin() const;
21   int* end() const;
22 
sizeConstSizedView23   constexpr std::size_t size() const {
24     *size_called = true;
25     return 3;
26   }
27 };
28 
29 struct SizedView : std::ranges::view_base {
30   bool* size_called;
31   int* begin() const;
32   int* end() const;
33 
sizeSizedView34   constexpr int size() {
35     *size_called = true;
36     return 5;
37   }
38 };
39 
40 struct UnsizedView : std::ranges::view_base {
41   int* begin() const;
42   int* end() const;
43 };
44 
45 template <class T>
46 concept HasSize = requires(T v) { v.size(); };
47 
48 static_assert(HasSize<ConstSizedView>);
49 static_assert(HasSize<const ConstSizedView>);
50 static_assert(HasSize<SizedView>);
51 static_assert(!HasSize<const SizedView>);
52 static_assert(!HasSize<UnsizedView>);
53 static_assert(!HasSize<const UnsizedView>);
54 
test()55 constexpr bool test() {
56   {
57     bool size_called = false;
58     std::ranges::as_rvalue_view view(ConstSizedView{{}, &size_called});
59     std::same_as<std::size_t> auto size = view.size();
60     assert(size == 3);
61     assert(size_called);
62   }
63 
64   {
65     bool size_called = false;
66     std::ranges::as_rvalue_view view(SizedView{{}, &size_called});
67     std::same_as<int> auto size = view.size();
68     assert(size == 5);
69     assert(size_called);
70   }
71 
72   return true;
73 }
74 
main(int,char **)75 int main(int, char**) {
76   test();
77   static_assert(test());
78 
79   return 0;
80 }
81