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-no-concepts
11 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
12 
13 // template<class R, class F>
14 //   transform_view(R&&, F) -> transform_view<views::all_t<R>, F>;
15 
16 #include <cassert>
17 #include <concepts>
18 #include <ranges>
19 #include <utility>
20 
21 struct PlusOne {
22     int operator()(int x) const;
23 };
24 
25 struct View : std::ranges::view_base {
26   int *begin() const;
27   int *end() const;
28 };
29 
30 struct Range {
31   int *begin() const;
32   int *end() const;
33 };
34 
35 struct BorrowedRange {
36   int *begin() const;
37   int *end() const;
38 };
39 template<>
40 inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true;
41 
42 void testCTAD() {
43     View v;
44     Range r;
45     BorrowedRange br;
46     PlusOne f;
47 
48     static_assert(std::same_as<
49         decltype(std::ranges::transform_view(v, f)),
50         std::ranges::transform_view<View, PlusOne>
51     >);
52     static_assert(std::same_as<
53         decltype(std::ranges::transform_view(std::move(v), f)),
54         std::ranges::transform_view<View, PlusOne>
55     >);
56     static_assert(std::same_as<
57         decltype(std::ranges::transform_view(r, f)),
58         std::ranges::transform_view<std::ranges::ref_view<Range>, PlusOne>
59     >);
60     static_assert(std::same_as<
61         decltype(std::ranges::transform_view(std::move(r), f)),
62         std::ranges::transform_view<std::ranges::owning_view<Range>, PlusOne>
63     >);
64     static_assert(std::same_as<
65         decltype(std::ranges::transform_view(br, f)),
66         std::ranges::transform_view<std::ranges::ref_view<BorrowedRange>, PlusOne>
67     >);
68     static_assert(std::same_as<
69         decltype(std::ranges::transform_view(std::move(br), f)),
70         std::ranges::transform_view<std::ranges::owning_view<BorrowedRange>, PlusOne>
71     >);
72 }
73