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 12 // decltype(auto) operator*(); 13 // decltype(auto) operator*() const 14 // requires dereferenceable<const I>; 15 16 #include <iterator> 17 #include <cassert> 18 19 #include "test_macros.h" 20 #include "types.h" 21 22 void test() { 23 int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; 24 25 { 26 auto iter1 = simple_iterator<int*>(buffer); 27 auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 28 auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8}); 29 30 const auto iter2 = simple_iterator<int*>(buffer); 31 const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 32 33 assert(*iter1 == 1); 34 assert(*commonIter1 == 1); 35 36 assert(*iter2 == 1); 37 assert(*commonIter2 == 1); 38 39 assert(*(commonIter1++) == 1); 40 assert(*commonIter1 == 2); 41 assert(*(++commonIter1) == 3); 42 assert(*commonIter1 == 3); 43 44 for (auto i = 3; commonIter1 != commonSent1; ++i) { 45 assert(*(commonIter1++) == i); 46 } 47 } 48 { 49 auto iter1 = value_iterator<int*>(buffer); 50 auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 51 auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8}); 52 53 const auto iter2 = value_iterator<int*>(buffer); 54 const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 55 56 assert(*iter1 == 1); 57 assert(*commonIter1 == 1); 58 59 assert(*iter2 == 1); 60 assert(*commonIter2 == 1); 61 62 assert(*(commonIter1++) == 1); 63 assert(*commonIter1 == 2); 64 assert(*(++commonIter1) == 3); 65 assert(*commonIter1 == 3); 66 67 for (auto i = 3; commonIter1 != commonSent1; ++i) { 68 assert(*(commonIter1++) == i); 69 } 70 } 71 { 72 auto iter1 = cpp17_input_iterator<int*>(buffer); 73 auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 74 auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8}); 75 76 const auto iter2 = cpp17_input_iterator<int*>(buffer); 77 const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 78 79 assert(*iter1 == 1); 80 assert(*commonIter1 == 1); 81 82 assert(*iter2 == 1); 83 assert(*commonIter2 == 1); 84 85 assert(*(commonIter1++) == 1); 86 assert(*commonIter1 == 2); 87 assert(*(++commonIter1) == 3); 88 assert(*commonIter1 == 3); 89 90 for (auto i = 3; commonIter1 != commonSent1; ++i) { 91 assert(*(commonIter1++) == i); 92 } 93 } 94 { 95 auto iter1 = forward_iterator<int*>(buffer); 96 auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 97 auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8}); 98 99 const auto iter2 = forward_iterator<int*>(buffer); 100 const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 101 102 assert(*iter1 == 1); 103 assert(*commonIter1 == 1); 104 105 assert(*iter2 == 1); 106 assert(*commonIter2 == 1); 107 108 assert(*(commonIter1++) == 1); 109 assert(*commonIter1 == 2); 110 assert(*(++commonIter1) == 3); 111 assert(*commonIter1 == 3); 112 113 for (auto i = 3; commonIter1 != commonSent1; ++i) { 114 assert(*(commonIter1++) == i); 115 } 116 } 117 { 118 auto iter1 = random_access_iterator<int*>(buffer); 119 auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 120 auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8}); 121 122 const auto iter2 = random_access_iterator<int*>(buffer); 123 const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1); 124 125 assert(*iter1 == 1); 126 assert(*commonIter1 == 1); 127 128 assert(*iter2 == 1); 129 assert(*commonIter2 == 1); 130 131 assert(*(commonIter1++) == 1); 132 assert(*commonIter1 == 2); 133 assert(*(++commonIter1) == 3); 134 assert(*commonIter1 == 3); 135 136 for (auto i = 3; commonIter1 != commonSent1; ++i) { 137 assert(*(commonIter1++) == i); 138 } 139 } 140 } 141 142 int main(int, char**) { 143 test(); 144 145 return 0; 146 } 147