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
10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11
12 // transform_view() requires std::default_initializable<V> &&
13 // std::default_initializable<F> = default;
14
15 #include <ranges>
16
17 #include <cassert>
18 #include <type_traits>
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 private:
27 int const* begin_;
28 int const* end_;
29 };
30
31 struct DefaultConstructibleFunction {
32 int state_;
DefaultConstructibleFunctionDefaultConstructibleFunction33 constexpr DefaultConstructibleFunction() : state_(100) { }
operator ()DefaultConstructibleFunction34 constexpr int operator()(int i) const { return i + state_; }
35 };
36
37 struct NoDefaultCtrView : std::ranges::view_base {
38 NoDefaultCtrView() = delete;
39 int* begin() const;
40 int* end() const;
41 };
42
43 struct NoDefaultFunction {
44 NoDefaultFunction() = delete;
45 constexpr int operator()(int i) const;
46 };
47
test()48 constexpr bool test() {
49 {
50 std::ranges::transform_view<DefaultConstructibleView, DefaultConstructibleFunction> view;
51 assert(view.size() == 3);
52 assert(view[0] == 101);
53 assert(view[1] == 102);
54 assert(view[2] == 103);
55 }
56
57 {
58 std::ranges::transform_view<DefaultConstructibleView, DefaultConstructibleFunction> view = {};
59 assert(view.size() == 3);
60 assert(view[0] == 101);
61 assert(view[1] == 102);
62 assert(view[2] == 103);
63 }
64
65 static_assert(!std::is_default_constructible_v<std::ranges::transform_view<NoDefaultCtrView, DefaultConstructibleFunction>>);
66 static_assert(!std::is_default_constructible_v<std::ranges::transform_view<DefaultConstructibleView, NoDefaultFunction>>);
67 static_assert(!std::is_default_constructible_v<std::ranges::transform_view<NoDefaultCtrView, NoDefaultFunction>>);
68
69 return true;
70 }
71
main(int,char **)72 int main(int, char**) {
73 test();
74 static_assert(test());
75
76 return 0;
77 }
78