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 auto begin() 14 // requires (!(simple-view<V> && 15 // random_access_range<const V> && sized_range<const V>)); 16 // constexpr auto begin() const 17 // requires random_access_range<const V> && sized_range<const V>; 18 19 #include <ranges> 20 21 #include "test_macros.h" 22 #include "test_iterators.h" 23 #include "types.h" 24 25 template<class T> 26 concept BeginInvocable = requires(std::ranges::drop_view<T> t) { t.begin(); }; 27 28 template <bool IsSimple> 29 struct MaybeSimpleView : std::ranges::view_base { 30 int* num_of_non_const_begin_calls; 31 int* num_of_const_begin_calls; 32 33 constexpr int* begin() { 34 ++(*num_of_non_const_begin_calls); 35 return nullptr; 36 } 37 constexpr std::conditional_t<IsSimple, int*, const int*> begin() const { 38 ++(*num_of_const_begin_calls); 39 return nullptr; 40 } 41 constexpr int* end() const { return nullptr; } 42 constexpr size_t size() const { return 0; } 43 }; 44 45 using SimpleView = MaybeSimpleView<true>; 46 using NonSimpleView = MaybeSimpleView<false>; 47 48 constexpr bool test() { 49 // random_access_range<const V> && sized_range<const V> 50 std::ranges::drop_view dropView1(MoveOnlyView(), 4); 51 assert(dropView1.begin() == globalBuff + 4); 52 53 // !random_access_range<const V> 54 std::ranges::drop_view dropView2(ForwardView(), 4); 55 assert(dropView2.begin().base() == globalBuff + 4); 56 57 // !random_access_range<const V> 58 std::ranges::drop_view dropView3(InputView(), 4); 59 assert(dropView3.begin().base() == globalBuff + 4); 60 61 // random_access_range<const V> && sized_range<const V> 62 std::ranges::drop_view dropView4(MoveOnlyView(), 8); 63 assert(dropView4.begin() == globalBuff + 8); 64 65 // random_access_range<const V> && sized_range<const V> 66 std::ranges::drop_view dropView5(MoveOnlyView(), 0); 67 assert(dropView5.begin() == globalBuff); 68 69 // random_access_range<const V> && sized_range<const V> 70 const std::ranges::drop_view dropView6(MoveOnlyView(), 0); 71 assert(dropView6.begin() == globalBuff); 72 73 // random_access_range<const V> && sized_range<const V> 74 std::ranges::drop_view dropView7(MoveOnlyView(), 10); 75 assert(dropView7.begin() == globalBuff + 8); 76 77 CountedView view8; 78 std::ranges::drop_view dropView8(view8, 5); 79 assert(base(base(dropView8.begin())) == globalBuff + 5); 80 assert(dropView8.begin().stride_count() == 5); 81 assert(base(base(dropView8.begin())) == globalBuff + 5); 82 assert(dropView8.begin().stride_count() == 5); 83 84 static_assert(!BeginInvocable<const ForwardView>); 85 86 { 87 static_assert(std::ranges::random_access_range<const SimpleView>); 88 static_assert(std::ranges::sized_range<const SimpleView>); 89 LIBCPP_STATIC_ASSERT(std::ranges::__simple_view<SimpleView>); 90 int non_const_calls = 0; 91 int const_calls = 0; 92 std::ranges::drop_view dropView(SimpleView{{}, &non_const_calls, &const_calls}, 4); 93 assert(dropView.begin() == nullptr); 94 assert(non_const_calls == 0); 95 assert(const_calls == 1); 96 assert(std::as_const(dropView).begin() == nullptr); 97 assert(non_const_calls == 0); 98 assert(const_calls == 2); 99 } 100 101 { 102 static_assert(std::ranges::random_access_range<const NonSimpleView>); 103 static_assert(std::ranges::sized_range<const NonSimpleView>); 104 LIBCPP_STATIC_ASSERT(!std::ranges::__simple_view<NonSimpleView>); 105 int non_const_calls = 0; 106 int const_calls = 0; 107 std::ranges::drop_view dropView(NonSimpleView{{}, &non_const_calls, &const_calls}, 4); 108 assert(dropView.begin() == nullptr); 109 assert(non_const_calls == 1); 110 assert(const_calls == 0); 111 assert(std::as_const(dropView).begin() == nullptr); 112 assert(non_const_calls == 1); 113 assert(const_calls == 1); 114 } 115 116 return true; 117 } 118 119 int main(int, char**) { 120 test(); 121 static_assert(test()); 122 123 return 0; 124 } 125