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 // zip_view() = default;
13
14 #include <ranges>
15
16 #include <cassert>
17 #include <type_traits>
18 #include <utility>
19
20 constexpr int buff[] = {1, 2, 3};
21
22 struct DefaultConstructibleView : std::ranges::view_base {
DefaultConstructibleViewDefaultConstructibleView23 constexpr DefaultConstructibleView() : begin_(buff), end_(buff + 3) {}
beginDefaultConstructibleView24 constexpr int const* begin() const { return begin_; }
endDefaultConstructibleView25 constexpr int const* end() const { return end_; }
26
27 private:
28 int const* begin_;
29 int const* end_;
30 };
31
32 struct NoDefaultCtrView : std::ranges::view_base {
33 NoDefaultCtrView() = delete;
34 int* begin() const;
35 int* end() const;
36 };
37
38 // The default constructor requires all underlying views to be default constructible.
39 // It is implicitly required by the tuple's constructor. If any of the iterators are
40 // not default constructible, zip iterator's =default would be implicitly deleted.
41 static_assert(std::is_default_constructible_v<std::ranges::zip_view<DefaultConstructibleView>>);
42 static_assert(
43 std::is_default_constructible_v<std::ranges::zip_view<DefaultConstructibleView, DefaultConstructibleView>>);
44 static_assert(!std::is_default_constructible_v<std::ranges::zip_view<DefaultConstructibleView, NoDefaultCtrView>>);
45 static_assert(!std::is_default_constructible_v<std::ranges::zip_view<NoDefaultCtrView, NoDefaultCtrView>>);
46 static_assert(!std::is_default_constructible_v<std::ranges::zip_view<NoDefaultCtrView>>);
47
test()48 constexpr bool test() {
49 {
50 using View = std::ranges::zip_view<DefaultConstructibleView, DefaultConstructibleView>;
51 View v = View(); // the default constructor is not explicit
52 assert(v.size() == 3);
53 auto it = v.begin();
54 using Pair = std::pair<const int&, const int&>;
55 assert(*it++ == Pair(buff[0], buff[0]));
56 assert(*it++ == Pair(buff[1], buff[1]));
57 assert(*it == Pair(buff[2], buff[2]));
58 }
59
60 return true;
61 }
62
main(int,char **)63 int main(int, char**) {
64 test();
65 static_assert(test());
66
67 return 0;
68 }
69