xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.elements/size.pass.cpp (revision 94461822c75d5080bf648f86552f7a59b76905c9)
1*94461822SHui Xie //===----------------------------------------------------------------------===//
2*94461822SHui Xie //
3*94461822SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*94461822SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5*94461822SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*94461822SHui Xie //
7*94461822SHui Xie //===----------------------------------------------------------------------===//
8*94461822SHui Xie 
9*94461822SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17
10*94461822SHui Xie 
11*94461822SHui Xie // constexpr auto size() requires sized_range<V>
12*94461822SHui Xie // constexpr auto size() const requires sized_range<const V>
13*94461822SHui Xie 
14*94461822SHui Xie #include <cassert>
15*94461822SHui Xie #include <ranges>
16*94461822SHui Xie #include <tuple>
17*94461822SHui Xie #include <utility>
18*94461822SHui Xie 
19*94461822SHui Xie #include "types.h"
20*94461822SHui Xie 
21*94461822SHui Xie template <class T>
22*94461822SHui Xie concept HasSize = requires(T t) { t.size(); };
23*94461822SHui Xie 
24*94461822SHui Xie static_assert(HasSize<std::ranges::elements_view<SimpleCommon, 0>>);
25*94461822SHui Xie static_assert(HasSize<const std::ranges::elements_view<SimpleCommon, 0>>);
26*94461822SHui Xie 
27*94461822SHui Xie struct NonSized : std::ranges::view_base {
28*94461822SHui Xie   using iterator = forward_iterator<std::tuple<int>*>;
29*94461822SHui Xie   iterator begin() const;
30*94461822SHui Xie   iterator end() const;
31*94461822SHui Xie };
32*94461822SHui Xie static_assert(!std::ranges::sized_range<NonSized>);
33*94461822SHui Xie static_assert(!std::ranges::sized_range<const NonSized>);
34*94461822SHui Xie 
35*94461822SHui Xie static_assert(!HasSize<std::ranges::elements_view<NonSized, 0>>);
36*94461822SHui Xie static_assert(!HasSize<const std::ranges::elements_view<NonSized, 0>>);
37*94461822SHui Xie 
38*94461822SHui Xie struct SizedNonConst : TupleBufferView {
39*94461822SHui Xie   using TupleBufferView::TupleBufferView;
40*94461822SHui Xie 
41*94461822SHui Xie   using iterator = forward_iterator<std::tuple<int>*>;
beginSizedNonConst42*94461822SHui Xie   constexpr auto begin() const { return iterator{buffer_}; }
endSizedNonConst43*94461822SHui Xie   constexpr auto end() const { return iterator{buffer_ + size_}; }
sizeSizedNonConst44*94461822SHui Xie   constexpr std::size_t size() { return size_; }
45*94461822SHui Xie };
46*94461822SHui Xie 
47*94461822SHui Xie static_assert(HasSize<std::ranges::elements_view<SizedNonConst, 0>>);
48*94461822SHui Xie static_assert(!HasSize<const std::ranges::elements_view<SizedNonConst, 0>>);
49*94461822SHui Xie 
50*94461822SHui Xie struct OnlyConstSized : TupleBufferView {
51*94461822SHui Xie   using TupleBufferView::TupleBufferView;
52*94461822SHui Xie 
53*94461822SHui Xie   using iterator = forward_iterator<std::tuple<int>*>;
beginOnlyConstSized54*94461822SHui Xie   constexpr auto begin() const { return iterator{buffer_}; }
endOnlyConstSized55*94461822SHui Xie   constexpr auto end() const { return iterator{buffer_ + size_}; }
sizeOnlyConstSized56*94461822SHui Xie   constexpr std::size_t size() const { return size_; }
57*94461822SHui Xie   constexpr std::size_t size() = delete;
58*94461822SHui Xie };
59*94461822SHui Xie 
60*94461822SHui Xie static_assert(HasSize<const OnlyConstSized>);
61*94461822SHui Xie static_assert(HasSize<std::ranges::elements_view<OnlyConstSized, 0>>);
62*94461822SHui Xie static_assert(HasSize<const std::ranges::elements_view<OnlyConstSized, 0>>);
63*94461822SHui Xie 
test()64*94461822SHui Xie constexpr bool test() {
65*94461822SHui Xie   std::tuple<int> buffer[] = {{1}, {2}, {3}};
66*94461822SHui Xie 
67*94461822SHui Xie   // non-const and const are sized
68*94461822SHui Xie   {
69*94461822SHui Xie     auto ev = std::views::elements<0>(buffer);
70*94461822SHui Xie     assert(ev.size() == 3);
71*94461822SHui Xie     assert(std::as_const(ev).size() == 3);
72*94461822SHui Xie   }
73*94461822SHui Xie 
74*94461822SHui Xie   {
75*94461822SHui Xie     // const-view non-sized range
76*94461822SHui Xie     auto ev = std::views::elements<0>(SizedNonConst{buffer});
77*94461822SHui Xie     assert(ev.size() == 3);
78*94461822SHui Xie   }
79*94461822SHui Xie 
80*94461822SHui Xie   return true;
81*94461822SHui Xie }
82*94461822SHui Xie 
main(int,char **)83*94461822SHui Xie int main(int, char**) {
84*94461822SHui Xie   test();
85*94461822SHui Xie   static_assert(test());
86*94461822SHui Xie 
87*94461822SHui Xie   return 0;
88*94461822SHui Xie }
89