xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.transform/end.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 sentinel<false> end();
14 // constexpr iterator<false> end() requires common_range<V>;
15 // constexpr sentinel<true> end() const
16 //   requires range<const V> &&
17 //            regular_invocable<const F&, range_reference_t<const V>>;
18 // constexpr iterator<true> end() const
19 //   requires common_range<const V> &&
20 //            regular_invocable<const F&, range_reference_t<const V>>;
21 
22 #include <ranges>
23 
24 #include "test_macros.h"
25 #include "types.h"
26 
27 template<class T>
28 concept EndInvocable = requires(T t) { t.end(); };
29 
30 template<class T>
31 concept EndIsIter = requires(T t) { ++t.end(); };
32 
33 constexpr bool test() {
34   {
35     std::ranges::transform_view transformView(ContiguousView{}, Increment{});
36     assert(transformView.end().base() == globalBuff + 8);
37   }
38 
39   {
40     std::ranges::transform_view transformView(ForwardView{}, Increment{});
41     assert(transformView.end().base().base() == globalBuff + 8);
42   }
43 
44   {
45     std::ranges::transform_view transformView(InputView{}, Increment{});
46     assert(transformView.end().base() == globalBuff + 8);
47   }
48 
49   {
50     const std::ranges::transform_view transformView(ContiguousView{}, IncrementConst{});
51     assert(transformView.end().base() == globalBuff + 8);
52   }
53 
54   static_assert(!EndInvocable<const std::ranges::transform_view<ContiguousView, Increment>>);
55   static_assert( EndInvocable<      std::ranges::transform_view<ContiguousView, Increment>>);
56   static_assert( EndInvocable<const std::ranges::transform_view<ContiguousView, IncrementConst>>);
57   static_assert(!EndInvocable<const std::ranges::transform_view<InputView, Increment>>);
58   static_assert( EndInvocable<      std::ranges::transform_view<InputView, Increment>>);
59   static_assert( EndInvocable<const std::ranges::transform_view<InputView, IncrementConst>>);
60 
61   static_assert(!EndIsIter<const std::ranges::transform_view<InputView, IncrementConst>>);
62   static_assert(!EndIsIter<      std::ranges::transform_view<InputView, Increment>>);
63   static_assert( EndIsIter<const std::ranges::transform_view<ContiguousView, IncrementConst>>);
64   static_assert( EndIsIter<      std::ranges::transform_view<ContiguousView, Increment>>);
65 
66   return true;
67 }
68 
69 int main(int, char**) {
70   test();
71   static_assert(test());
72 
73   return 0;
74 }
75