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