brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 69ef362 Raw
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