1*042dc3c4SHui Xie //===----------------------------------------------------------------------===//
2*042dc3c4SHui Xie //
3*042dc3c4SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*042dc3c4SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5*042dc3c4SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*042dc3c4SHui Xie //
7*042dc3c4SHui Xie //===----------------------------------------------------------------------===//
8*042dc3c4SHui Xie
9*042dc3c4SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10*042dc3c4SHui Xie // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11*042dc3c4SHui Xie
12*042dc3c4SHui Xie // constexpr auto operator[](difference_type n) const requires
13*042dc3c4SHui Xie // all_random_access<Const, Views...>
14*042dc3c4SHui Xie
15*042dc3c4SHui Xie #include <ranges>
16*042dc3c4SHui Xie #include <cassert>
17*042dc3c4SHui Xie
18*042dc3c4SHui Xie #include "../types.h"
19*042dc3c4SHui Xie
test()20*042dc3c4SHui Xie constexpr bool test() {
21*042dc3c4SHui Xie int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
22*042dc3c4SHui Xie
23*042dc3c4SHui Xie {
24*042dc3c4SHui Xie // random_access_range
25*042dc3c4SHui Xie std::ranges::zip_view v(SizedRandomAccessView{buffer}, std::views::iota(0));
26*042dc3c4SHui Xie auto it = v.begin();
27*042dc3c4SHui Xie assert(it[0] == *it);
28*042dc3c4SHui Xie assert(it[2] == *(it + 2));
29*042dc3c4SHui Xie assert(it[4] == *(it + 4));
30*042dc3c4SHui Xie
31*042dc3c4SHui Xie static_assert(std::is_same_v<decltype(it[2]), std::pair<int&, int>>);
32*042dc3c4SHui Xie }
33*042dc3c4SHui Xie
34*042dc3c4SHui Xie {
35*042dc3c4SHui Xie // contiguous_range
36*042dc3c4SHui Xie std::ranges::zip_view v(ContiguousCommonView{buffer}, ContiguousCommonView{buffer});
37*042dc3c4SHui Xie auto it = v.begin();
38*042dc3c4SHui Xie assert(it[0] == *it);
39*042dc3c4SHui Xie assert(it[2] == *(it + 2));
40*042dc3c4SHui Xie assert(it[4] == *(it + 4));
41*042dc3c4SHui Xie
42*042dc3c4SHui Xie static_assert(std::is_same_v<decltype(it[2]), std::pair<int&, int&>>);
43*042dc3c4SHui Xie }
44*042dc3c4SHui Xie
45*042dc3c4SHui Xie {
46*042dc3c4SHui Xie // non random_access_range
47*042dc3c4SHui Xie std::ranges::zip_view v(BidiCommonView{buffer});
48*042dc3c4SHui Xie auto iter = v.begin();
49*042dc3c4SHui Xie const auto canSubscript = [](auto&& it) { return requires { it[0]; }; };
50*042dc3c4SHui Xie static_assert(!canSubscript(iter));
51*042dc3c4SHui Xie }
52*042dc3c4SHui Xie
53*042dc3c4SHui Xie return true;
54*042dc3c4SHui Xie }
55*042dc3c4SHui Xie
main(int,char **)56*042dc3c4SHui Xie int main(int, char**) {
57*042dc3c4SHui Xie test();
58*042dc3c4SHui Xie static_assert(test());
59*042dc3c4SHui Xie
60*042dc3c4SHui Xie return 0;
61*042dc3c4SHui Xie }
62