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: libcpp-has-no-incomplete-ranges 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 HasConstQualifiedEnd = requires(const T& t) { t.end(); }; 29 30 constexpr bool test() { 31 { 32 using TransformView = std::ranges::transform_view<ForwardView, PlusOneMutable>; 33 static_assert(std::ranges::common_range<TransformView>); 34 TransformView tv; 35 auto it = tv.end(); 36 using It = decltype(it); 37 ASSERT_SAME_TYPE(decltype(static_cast<It&>(it).base()), const forward_iterator<int*>&); 38 ASSERT_SAME_TYPE(decltype(static_cast<It&&>(it).base()), forward_iterator<int*>); 39 ASSERT_SAME_TYPE(decltype(static_cast<const It&>(it).base()), const forward_iterator<int*>&); 40 ASSERT_SAME_TYPE(decltype(static_cast<const It&&>(it).base()), const forward_iterator<int*>&); 41 assert(base(it.base()) == globalBuff + 8); 42 assert(base(std::move(it).base()) == globalBuff + 8); 43 static_assert(!HasConstQualifiedEnd<TransformView>); 44 } 45 { 46 using TransformView = std::ranges::transform_view<InputView, PlusOneMutable>; 47 static_assert(!std::ranges::common_range<TransformView>); 48 TransformView tv; 49 auto sent = tv.end(); 50 using Sent = decltype(sent); 51 ASSERT_SAME_TYPE(decltype(static_cast<Sent&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 52 ASSERT_SAME_TYPE(decltype(static_cast<Sent&&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 53 ASSERT_SAME_TYPE(decltype(static_cast<const Sent&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 54 ASSERT_SAME_TYPE(decltype(static_cast<const Sent&&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 55 assert(base(base(sent.base())) == globalBuff + 8); 56 assert(base(base(std::move(sent).base())) == globalBuff + 8); 57 static_assert(!HasConstQualifiedEnd<TransformView>); 58 } 59 { 60 using TransformView = std::ranges::transform_view<InputView, PlusOne>; 61 static_assert(!std::ranges::common_range<TransformView>); 62 TransformView tv; 63 auto sent = tv.end(); 64 using Sent = decltype(sent); 65 ASSERT_SAME_TYPE(decltype(static_cast<Sent&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 66 ASSERT_SAME_TYPE(decltype(static_cast<Sent&&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 67 ASSERT_SAME_TYPE(decltype(static_cast<const Sent&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 68 ASSERT_SAME_TYPE(decltype(static_cast<const Sent&&>(sent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 69 assert(base(base(sent.base())) == globalBuff + 8); 70 assert(base(base(std::move(sent).base())) == globalBuff + 8); 71 72 auto csent = std::as_const(tv).end(); 73 using CSent = decltype(csent); 74 ASSERT_SAME_TYPE(decltype(static_cast<CSent&>(csent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 75 ASSERT_SAME_TYPE(decltype(static_cast<CSent&&>(csent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 76 ASSERT_SAME_TYPE(decltype(static_cast<const CSent&>(csent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 77 ASSERT_SAME_TYPE(decltype(static_cast<const CSent&&>(csent).base()), sentinel_wrapper<cpp20_input_iterator<int*>>); 78 assert(base(base(csent.base())) == globalBuff + 8); 79 assert(base(base(std::move(csent).base())) == globalBuff + 8); 80 } 81 { 82 using TransformView = std::ranges::transform_view<MoveOnlyView, PlusOneMutable>; 83 static_assert(std::ranges::common_range<TransformView>); 84 TransformView tv; 85 auto it = tv.end(); 86 using It = decltype(it); 87 ASSERT_SAME_TYPE(decltype(static_cast<It&>(it).base()), int* const&); 88 ASSERT_SAME_TYPE(decltype(static_cast<It&&>(it).base()), int*); 89 ASSERT_SAME_TYPE(decltype(static_cast<const It&>(it).base()), int* const&); 90 ASSERT_SAME_TYPE(decltype(static_cast<const It&&>(it).base()), int* const&); 91 assert(base(it.base()) == globalBuff + 8); 92 assert(base(std::move(it).base()) == globalBuff + 8); 93 static_assert(!HasConstQualifiedEnd<TransformView>); 94 } 95 { 96 using TransformView = std::ranges::transform_view<MoveOnlyView, PlusOne>; 97 static_assert(std::ranges::common_range<TransformView>); 98 TransformView tv; 99 auto it = tv.end(); 100 using It = decltype(it); 101 ASSERT_SAME_TYPE(decltype(static_cast<It&>(it).base()), int* const&); 102 ASSERT_SAME_TYPE(decltype(static_cast<It&&>(it).base()), int*); 103 ASSERT_SAME_TYPE(decltype(static_cast<const It&>(it).base()), int* const&); 104 ASSERT_SAME_TYPE(decltype(static_cast<const It&&>(it).base()), int* const&); 105 assert(base(it.base()) == globalBuff + 8); 106 assert(base(std::move(it).base()) == globalBuff + 8); 107 108 auto csent = std::as_const(tv).end(); 109 using CSent = decltype(csent); 110 ASSERT_SAME_TYPE(decltype(static_cast<CSent&>(csent).base()), int* const&); 111 ASSERT_SAME_TYPE(decltype(static_cast<CSent&&>(csent).base()), int*); 112 ASSERT_SAME_TYPE(decltype(static_cast<const CSent&>(csent).base()), int* const&); 113 ASSERT_SAME_TYPE(decltype(static_cast<const CSent&&>(csent).base()), int* const&); 114 assert(base(base(csent.base())) == globalBuff + 8); 115 assert(base(base(std::move(csent).base())) == globalBuff + 8); 116 } 117 return true; 118 } 119 120 int main(int, char**) { 121 test(); 122 static_assert(test()); 123 124 return 0; 125 } 126