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 end = tv.end(); 36 ASSERT_SAME_TYPE(decltype(end.base()), std::ranges::sentinel_t<ForwardView>); 37 assert(base(end.base()) == globalBuff + 8); 38 static_assert(!HasConstQualifiedEnd<TransformView>); 39 } 40 { 41 using TransformView = std::ranges::transform_view<InputView, PlusOneMutable>; 42 static_assert(!std::ranges::common_range<TransformView>); 43 TransformView tv; 44 auto end = tv.end(); 45 ASSERT_SAME_TYPE(decltype(end.base()), std::ranges::sentinel_t<InputView>); 46 assert(base(base(end.base())) == globalBuff + 8); 47 static_assert(!HasConstQualifiedEnd<TransformView>); 48 } 49 { 50 using TransformView = std::ranges::transform_view<InputView, PlusOne>; 51 static_assert(!std::ranges::common_range<TransformView>); 52 TransformView tv; 53 auto end = tv.end(); 54 ASSERT_SAME_TYPE(decltype(end.base()), std::ranges::sentinel_t<InputView>); 55 assert(base(base(end.base())) == globalBuff + 8); 56 auto cend = std::as_const(tv).end(); 57 ASSERT_SAME_TYPE(decltype(cend.base()), std::ranges::sentinel_t<const InputView>); 58 assert(base(base(cend.base())) == globalBuff + 8); 59 } 60 { 61 using TransformView = std::ranges::transform_view<MoveOnlyView, PlusOneMutable>; 62 static_assert(std::ranges::common_range<TransformView>); 63 TransformView tv; 64 auto end = tv.end(); 65 ASSERT_SAME_TYPE(decltype(end.base()), std::ranges::sentinel_t<MoveOnlyView>); 66 assert(end.base() == globalBuff + 8); 67 static_assert(!HasConstQualifiedEnd<TransformView>); 68 } 69 { 70 using TransformView = std::ranges::transform_view<MoveOnlyView, PlusOne>; 71 static_assert(std::ranges::common_range<TransformView>); 72 TransformView tv; 73 auto end = tv.end(); 74 ASSERT_SAME_TYPE(decltype(end.base()), std::ranges::sentinel_t<MoveOnlyView>); 75 assert(end.base() == globalBuff + 8); 76 auto cend = std::as_const(tv).end(); 77 ASSERT_SAME_TYPE(decltype(cend.base()), std::ranges::sentinel_t<const MoveOnlyView>); 78 assert(cend.base() == globalBuff + 8); 79 } 80 return true; 81 } 82 83 int main(int, char**) { 84 test(); 85 static_assert(test()); 86 87 return 0; 88 } 89