xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.transform/begin.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 iterator<false> begin();
14 // constexpr iterator<true> begin() const
15 //   requires range<const V> &&
16 //            regular_invocable<const F&, range_reference_t<const V>>;
17 
18 #include <ranges>
19 
20 #include "test_macros.h"
21 #include "types.h"
22 
23 template<class T>
24 concept BeginInvocable = requires(T t) { t.begin(); };
25 
26 constexpr bool test() {
27   int buff[8] = {0, 1, 2, 3, 4, 5, 6, 7};
28 
29   {
30     std::ranges::transform_view transformView(ContiguousView{buff}, Increment{});
31     assert(transformView.begin().base() == buff);
32     assert(*transformView.begin() == 1);
33   }
34 
35   {
36     std::ranges::transform_view transformView(ForwardView{buff}, Increment{});
37     assert(transformView.begin().base().base() == buff);
38     assert(*transformView.begin() == 1);
39   }
40 
41   {
42     std::ranges::transform_view transformView(InputView{buff}, Increment{});
43     assert(transformView.begin().base().base() == buff);
44     assert(*transformView.begin() == 1);
45   }
46 
47   {
48     const std::ranges::transform_view transformView(ContiguousView{buff}, IncrementConst{});
49     assert(*transformView.begin() == 1);
50   }
51 
52   static_assert(!BeginInvocable<const std::ranges::transform_view<ContiguousView, Increment>>);
53 
54   return true;
55 }
56 
57 int main(int, char**) {
58   test();
59   static_assert(test());
60 
61   return 0;
62 }
63