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: gcc-10 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 EndInvocable = requires(T t) { t.end(); }; 29 30 template<class T> 31 concept EndIsIter = requires(T t) { ++t.end(); }; 32 33 constexpr bool test() { 34 { 35 std::ranges::transform_view transformView(ContiguousView{}, Increment{}); 36 assert(transformView.end().base() == globalBuff + 8); 37 } 38 39 { 40 std::ranges::transform_view transformView(ForwardView{}, Increment{}); 41 assert(transformView.end().base().base() == globalBuff + 8); 42 } 43 44 { 45 std::ranges::transform_view transformView(InputView{}, Increment{}); 46 assert(transformView.end().base() == globalBuff + 8); 47 } 48 49 { 50 const std::ranges::transform_view transformView(ContiguousView{}, IncrementConst{}); 51 assert(transformView.end().base() == globalBuff + 8); 52 } 53 54 static_assert(!EndInvocable<const std::ranges::transform_view<ContiguousView, Increment>>); 55 static_assert( EndInvocable< std::ranges::transform_view<ContiguousView, Increment>>); 56 static_assert( EndInvocable<const std::ranges::transform_view<ContiguousView, IncrementConst>>); 57 static_assert(!EndInvocable<const std::ranges::transform_view<InputView, Increment>>); 58 static_assert( EndInvocable< std::ranges::transform_view<InputView, Increment>>); 59 static_assert( EndInvocable<const std::ranges::transform_view<InputView, IncrementConst>>); 60 61 static_assert(!EndIsIter<const std::ranges::transform_view<InputView, IncrementConst>>); 62 static_assert(!EndIsIter< std::ranges::transform_view<InputView, Increment>>); 63 static_assert( EndIsIter<const std::ranges::transform_view<ContiguousView, IncrementConst>>); 64 static_assert( EndIsIter< std::ranges::transform_view<ContiguousView, Increment>>); 65 66 return true; 67 } 68 69 int main(int, char**) { 70 test(); 71 static_assert(test()); 72 73 return 0; 74 } 75