brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · a397a87 Raw
110 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 counted_iterator operator+(iter_difference_t<I> n) const12//     requires random_access_iterator<I>;13// friend constexpr counted_iterator operator+(14//   iter_difference_t<I> n, const counted_iterator& x)15//     requires random_access_iterator<I>;16// constexpr counted_iterator& operator+=(iter_difference_t<I> n)17//     requires random_access_iterator<I>;18 19#include <iterator>20 21#include "test_macros.h"22#include "test_iterators.h"23 24template<class Iter>25concept PlusEnabled = requires(Iter& iter) {26  iter + 1;27};28 29template<class Iter>30concept PlusEqEnabled = requires(Iter& iter) {31  iter += 1;32};33 34constexpr bool test() {35  int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};36 37  {38    {39      using Counted = std::counted_iterator<random_access_iterator<int*>>;40      std::counted_iterator iter(random_access_iterator<int*>{buffer}, 8);41      assert(iter + 2 == Counted(random_access_iterator<int*>{buffer + 2}, 6));42      assert(iter + 0 == Counted(random_access_iterator<int*>{buffer}, 8));43 44      ASSERT_SAME_TYPE(decltype(iter + 2), Counted);45    }46    {47      using Counted = const std::counted_iterator<random_access_iterator<int*>>;48      const std::counted_iterator iter(random_access_iterator<int*>{buffer}, 8);49      assert(iter + 8 == Counted(random_access_iterator<int*>{buffer + 8}, 0));50      assert(iter + 0 == Counted(random_access_iterator<int*>{buffer}, 8));51 52      ASSERT_SAME_TYPE(decltype(iter + 2), std::remove_const_t<Counted>);53    }54  }55 56  {57    {58      using Counted = std::counted_iterator<random_access_iterator<int*>>;59      std::counted_iterator iter(random_access_iterator<int*>{buffer}, 8);60      assert(2 + iter == Counted(random_access_iterator<int*>{buffer + 2}, 6));61      assert(0 + iter == Counted(random_access_iterator<int*>{buffer}, 8));62 63      ASSERT_SAME_TYPE(decltype(iter + 2), Counted);64    }65    {66      using Counted = const std::counted_iterator<random_access_iterator<int*>>;67      const std::counted_iterator iter(random_access_iterator<int*>{buffer}, 8);68      assert(8 + iter == Counted(random_access_iterator<int*>{buffer + 8}, 0));69      assert(0 + iter == Counted(random_access_iterator<int*>{buffer}, 8));70 71      ASSERT_SAME_TYPE(decltype(iter + 2), std::remove_const_t<Counted>);72    }73  }74 75  {76    {77      using Counted = std::counted_iterator<random_access_iterator<int*>>;78      std::counted_iterator iter(random_access_iterator<int*>{buffer}, 8);79      assert((iter += 2) == Counted(random_access_iterator<int*>{buffer + 2}, 6));80      assert((iter += 0) == Counted(random_access_iterator<int*>{buffer + 2}, 6));81 82      ASSERT_SAME_TYPE(decltype(iter += 2), Counted&);83    }84    {85      using Counted = std::counted_iterator<contiguous_iterator<int*>>;86      std::counted_iterator iter(contiguous_iterator<int*>{buffer}, 8);87      assert((iter += 8) == Counted(contiguous_iterator<int*>{buffer + 8}, 0));88      assert((iter += 0) == Counted(contiguous_iterator<int*>{buffer + 8}, 0));89 90      ASSERT_SAME_TYPE(decltype(iter += 2), Counted&);91    }92    {93      static_assert( PlusEnabled<std::counted_iterator<random_access_iterator<int*>>>);94      static_assert(!PlusEnabled<std::counted_iterator<bidirectional_iterator<int*>>>);95 96      static_assert( PlusEqEnabled<      std::counted_iterator<random_access_iterator<int*>>>);97      static_assert(!PlusEqEnabled<const std::counted_iterator<random_access_iterator<int*>>>);98    }99  }100 101  return true;102}103 104int main(int, char**) {105  test();106  static_assert(test());107 108  return 0;109}110