xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.transform/base.pass.cpp (revision 0e09a41b415bbf2ef0b7c3ee8bced256a6dd2b87)
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: gcc-10
12 
13 // constexpr V base() const& requires copy_constructible<V>
14 // constexpr V base() &&
15 
16 #include <ranges>
17 
18 #include "test_macros.h"
19 #include "types.h"
20 
21 constexpr bool test() {
22   {
23     std::ranges::transform_view<ContiguousView, Increment> transformView;
24     ContiguousView base = std::move(transformView).base();
25     ASSERT_SAME_TYPE(ContiguousView, decltype(std::move(transformView).base()));
26     assert(std::ranges::begin(base) == globalBuff);
27   }
28 
29   {
30     std::ranges::transform_view<CopyableView, Increment> transformView;
31     CopyableView base1 = transformView.base();
32     ASSERT_SAME_TYPE(CopyableView, decltype(transformView.base()));
33     assert(std::ranges::begin(base1) == globalBuff);
34 
35     CopyableView base2 = std::move(transformView).base();
36     ASSERT_SAME_TYPE(CopyableView, decltype(std::move(transformView).base()));
37     assert(std::ranges::begin(base2) == globalBuff);
38   }
39 
40   {
41     const std::ranges::transform_view<CopyableView, Increment> transformView;
42     const CopyableView base1 = transformView.base();
43     ASSERT_SAME_TYPE(CopyableView, decltype(transformView.base()));
44     assert(std::ranges::begin(base1) == globalBuff);
45 
46     const CopyableView base2 = std::move(transformView).base();
47     ASSERT_SAME_TYPE(CopyableView, decltype(std::move(transformView).base()));
48     assert(std::ranges::begin(base2) == globalBuff);
49   }
50 
51   return true;
52 }
53 
54 int main(int, char**) {
55   test();
56   static_assert(test());
57 
58   return 0;
59 }
60