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