1770602cfSLouis Dionne //===----------------------------------------------------------------------===//
2770602cfSLouis Dionne //
3770602cfSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4770602cfSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5770602cfSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6770602cfSLouis Dionne //
7770602cfSLouis Dionne //===----------------------------------------------------------------------===//
8770602cfSLouis Dionne
9770602cfSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10770602cfSLouis Dionne // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11770602cfSLouis Dionne
12770602cfSLouis Dionne // transform_view() requires std::default_initializable<V> &&
13770602cfSLouis Dionne // std::default_initializable<F> = default;
14770602cfSLouis Dionne
15770602cfSLouis Dionne #include <ranges>
16770602cfSLouis Dionne
17770602cfSLouis Dionne #include <cassert>
18770602cfSLouis Dionne #include <type_traits>
19770602cfSLouis Dionne
20770602cfSLouis Dionne constexpr int buff[] = {1, 2, 3};
21770602cfSLouis Dionne
22770602cfSLouis Dionne struct DefaultConstructibleView : std::ranges::view_base {
DefaultConstructibleViewDefaultConstructibleView23770602cfSLouis Dionne constexpr DefaultConstructibleView() : begin_(buff), end_(buff + 3) { }
beginDefaultConstructibleView24770602cfSLouis Dionne constexpr int const* begin() const { return begin_; }
endDefaultConstructibleView25770602cfSLouis Dionne constexpr int const* end() const { return end_; }
26770602cfSLouis Dionne private:
27770602cfSLouis Dionne int const* begin_;
28770602cfSLouis Dionne int const* end_;
29770602cfSLouis Dionne };
30770602cfSLouis Dionne
31770602cfSLouis Dionne struct DefaultConstructibleFunction {
32770602cfSLouis Dionne int state_;
DefaultConstructibleFunctionDefaultConstructibleFunction33770602cfSLouis Dionne constexpr DefaultConstructibleFunction() : state_(100) { }
operator ()DefaultConstructibleFunction34770602cfSLouis Dionne constexpr int operator()(int i) const { return i + state_; }
35770602cfSLouis Dionne };
36770602cfSLouis Dionne
37*042dc3c4SHui Xie struct NoDefaultCtrView : std::ranges::view_base {
38*042dc3c4SHui Xie NoDefaultCtrView() = delete;
39770602cfSLouis Dionne int* begin() const;
40770602cfSLouis Dionne int* end() const;
41770602cfSLouis Dionne };
42770602cfSLouis Dionne
43770602cfSLouis Dionne struct NoDefaultFunction {
44770602cfSLouis Dionne NoDefaultFunction() = delete;
45770602cfSLouis Dionne constexpr int operator()(int i) const;
46770602cfSLouis Dionne };
47770602cfSLouis Dionne
test()48770602cfSLouis Dionne constexpr bool test() {
49770602cfSLouis Dionne {
50770602cfSLouis Dionne std::ranges::transform_view<DefaultConstructibleView, DefaultConstructibleFunction> view;
51770602cfSLouis Dionne assert(view.size() == 3);
52770602cfSLouis Dionne assert(view[0] == 101);
53770602cfSLouis Dionne assert(view[1] == 102);
54770602cfSLouis Dionne assert(view[2] == 103);
55770602cfSLouis Dionne }
56770602cfSLouis Dionne
57770602cfSLouis Dionne {
58770602cfSLouis Dionne std::ranges::transform_view<DefaultConstructibleView, DefaultConstructibleFunction> view = {};
59770602cfSLouis Dionne assert(view.size() == 3);
60770602cfSLouis Dionne assert(view[0] == 101);
61770602cfSLouis Dionne assert(view[1] == 102);
62770602cfSLouis Dionne assert(view[2] == 103);
63770602cfSLouis Dionne }
64770602cfSLouis Dionne
65*042dc3c4SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::transform_view<NoDefaultCtrView, DefaultConstructibleFunction>>);
66770602cfSLouis Dionne static_assert(!std::is_default_constructible_v<std::ranges::transform_view<DefaultConstructibleView, NoDefaultFunction>>);
67*042dc3c4SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::transform_view<NoDefaultCtrView, NoDefaultFunction>>);
68770602cfSLouis Dionne
69770602cfSLouis Dionne return true;
70770602cfSLouis Dionne }
71770602cfSLouis Dionne
main(int,char **)72770602cfSLouis Dionne int main(int, char**) {
73770602cfSLouis Dionne test();
74770602cfSLouis Dionne static_assert(test());
75770602cfSLouis Dionne
76770602cfSLouis Dionne return 0;
77770602cfSLouis Dionne }
78