brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 6e161fb Raw
82 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// constexpr iter_difference_t<I> count() const noexcept;12 13#include <iterator>14 15#include "test_macros.h"16#include "test_iterators.h"17 18struct InputOrOutputArchetype {19  using difference_type = int;20 21  int *ptr;22 23  constexpr int operator*() { return *ptr; }24  constexpr void operator++(int) { ++ptr; }25  constexpr InputOrOutputArchetype& operator++() { ++ptr; return *this; }26};27 28constexpr bool test() {29  int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};30 31  {32    std::counted_iterator iter(cpp20_input_iterator<int*>{buffer}, 8);33    for (int i = 8; i != 0; --i, ++iter)34      assert(iter.count() == i);35 36    static_assert(noexcept(iter.count()));37  }38  {39    std::counted_iterator iter(forward_iterator<int*>{buffer}, 8);40    for (int i = 8; i != 0; --i, ++iter)41      assert(iter.count() == i);42 43    static_assert(noexcept(iter.count()));44  }45  {46    std::counted_iterator iter(contiguous_iterator<int*>{buffer}, 8);47    for (int i = 8; i != 0; --i, ++iter)48      assert(iter.count() == i);49  }50  {51    std::counted_iterator iter(InputOrOutputArchetype{buffer + 2}, 6);52    assert(iter.count() == 6);53  }54 55  // Const tests.56  {57    const std::counted_iterator iter(cpp20_input_iterator<int*>{buffer}, 8);58    assert(iter.count() == 8);59  }60  {61    const std::counted_iterator iter(forward_iterator<int*>{buffer + 1}, 7);62    assert(iter.count() == 7);63  }64  {65    const std::counted_iterator iter(contiguous_iterator<int*>{buffer + 2}, 6);66    assert(iter.count() == 6);67  }68  {69    const std::counted_iterator iter(InputOrOutputArchetype{buffer + 2}, 6);70    assert(iter.count() == 6);71  }72 73  return true;74}75 76int main(int, char**) {77  test();78  static_assert(test());79 80  return 0;81}82