xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/deref.pass.cpp (revision cbe03646c620d08da69eac241450f32f4025c635)
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, c++20
10 
11 // constexpr auto operator*() const;
12 
13 #include <array>
14 #include <cassert>
15 #include <ranges>
16 #include <tuple>
17 
18 #include "../types.h"
19 
20 constexpr bool test() {
21   std::array a{1, 2, 3, 4};
22   std::array b{4.1, 3.2, 4.3};
23   {
24     // single range
25     std::ranges::zip_view v(a);
26     auto it = v.begin();
27     assert(&(std::get<0>(*it)) == &(a[0]));
28     static_assert(std::is_same_v<decltype(*it), std::tuple<int&>>);
29   }
30 
31   {
32     // operator* is const
33     std::ranges::zip_view v(a);
34     const auto it = v.begin();
35     assert(&(std::get<0>(*it)) == &(a[0]));
36   }
37 
38   {
39     // two ranges with different types
40     std::ranges::zip_view v(a, b);
41     auto it = v.begin();
42     auto [x, y] = *it;
43     assert(&x == &(a[0]));
44     assert(&y == &(b[0]));
45     static_assert(std::is_same_v<decltype(*it), std::tuple<int&, double&>>);
46 
47     x = 5;
48     y = 0.1;
49     assert(a[0] == 5);
50     assert(b[0] == 0.1);
51   }
52 
53   {
54     // underlying range with prvalue range_reference_t
55     std::ranges::zip_view v(a, b, std::views::iota(0, 5));
56     auto it = v.begin();
57     assert(&(std::get<0>(*it)) == &(a[0]));
58     assert(&(std::get<1>(*it)) == &(b[0]));
59     assert(std::get<2>(*it) == 0);
60     static_assert(std::is_same_v<decltype(*it), std::tuple<int&, double&, int>>);
61   }
62 
63   {
64     // const-correctness
65     std::ranges::zip_view v(a, std::as_const(a));
66     auto it = v.begin();
67     assert(&(std::get<0>(*it)) == &(a[0]));
68     assert(&(std::get<1>(*it)) == &(a[0]));
69     static_assert(std::is_same_v<decltype(*it), std::tuple<int&, int const&>>);
70   }
71   return true;
72 }
73 
74 int main(int, char**) {
75   test();
76   static_assert(test());
77 
78   return 0;
79 }
80