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 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11 
12 // constexpr auto operator*() const;
13 
14 #include <array>
15 #include <cassert>
16 #include <ranges>
17 #include <tuple>
18 
19 #include "../types.h"
20 
test()21 constexpr bool test() {
22   std::array a{1, 2, 3, 4};
23   std::array b{4.1, 3.2, 4.3};
24   {
25     // single range
26     std::ranges::zip_view v(a);
27     auto it = v.begin();
28     assert(&(std::get<0>(*it)) == &(a[0]));
29     static_assert(std::is_same_v<decltype(*it), std::tuple<int&>>);
30   }
31 
32   {
33     // operator* is const
34     std::ranges::zip_view v(a);
35     const auto it = v.begin();
36     assert(&(std::get<0>(*it)) == &(a[0]));
37   }
38 
39   {
40     // two ranges with different types
41     std::ranges::zip_view v(a, b);
42     auto it = v.begin();
43     auto [x, y] = *it;
44     assert(&x == &(a[0]));
45     assert(&y == &(b[0]));
46     static_assert(std::is_same_v<decltype(*it), std::pair<int&, double&>>);
47 
48     x = 5;
49     y = 0.1;
50     assert(a[0] == 5);
51     assert(b[0] == 0.1);
52   }
53 
54   {
55     // underlying range with prvalue range_reference_t
56     std::ranges::zip_view v(a, b, std::views::iota(0, 5));
57     auto it = v.begin();
58     assert(&(std::get<0>(*it)) == &(a[0]));
59     assert(&(std::get<1>(*it)) == &(b[0]));
60     assert(std::get<2>(*it) == 0);
61     static_assert(std::is_same_v<decltype(*it), std::tuple<int&, double&, int>>);
62   }
63 
64   {
65     // const-correctness
66     std::ranges::zip_view v(a, std::as_const(a));
67     auto it = v.begin();
68     assert(&(std::get<0>(*it)) == &(a[0]));
69     assert(&(std::get<1>(*it)) == &(a[0]));
70     static_assert(std::is_same_v<decltype(*it), std::pair<int&, int const&>>);
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