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