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-has-no-incomplete-ranges
11 
12 // class transform_view::<sentinel>;
13 
14 #include <ranges>
15 
16 #include "test_macros.h"
17 #include "../types.h"
18 
19 template<class T>
20 concept EndIsIter = requires(T t) { ++t.end(); };
21 
test()22 constexpr bool test() {
23   std::ranges::transform_view<SizedSentinelView, PlusOne> transformView1;
24   // Going to const and back.
25   auto sent1 = transformView1.end();
26   std::ranges::sentinel_t<const std::ranges::transform_view<SizedSentinelView, PlusOne>> sent2{sent1};
27   std::ranges::sentinel_t<const std::ranges::transform_view<SizedSentinelView, PlusOne>> sent3{sent2};
28   (void)sent3;
29 
30   static_assert(!EndIsIter<decltype(sent1)>);
31   static_assert(!EndIsIter<decltype(sent2)>);
32   assert(sent1.base() == globalBuff + 8);
33 
34   std::ranges::transform_view transformView2(SizedSentinelView{4}, PlusOne());
35   auto sent4 = transformView2.end();
36   auto iter = transformView1.begin();
37   {
38     assert(iter != sent1);
39     assert(iter != sent2);
40     assert(iter != sent4);
41   }
42 
43   {
44     assert(iter + 8 == sent1);
45     assert(iter + 8 == sent2);
46     assert(iter + 4 == sent4);
47   }
48 
49   {
50     assert(sent1 - iter  == 8);
51     assert(sent4 - iter  == 4);
52     assert(iter  - sent1 == -8);
53     assert(iter  - sent4 == -4);
54   }
55 
56   return true;
57 }
58 
main(int,char **)59 int main(int, char**) {
60   test();
61   static_assert(test());
62 
63   return 0;
64 }
65