brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 705a744 Raw
180 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// friend constexpr iterator operator-(iterator i, difference_type n)12//   requires advanceable<W>;13// friend constexpr difference_type operator-(const iterator& x, const iterator& y)14//   requires advanceable<W>;15 16#include <cassert>17#include <cstdint>18#include <ranges>19#include <type_traits>20 21#include "test_macros.h"22#include "../types.h"23 24// If we're compiling for 32 bit or windows, int and long are the same size, so long long is the correct difference type.25#if INTPTR_MAX == INT32_MAX || defined(_WIN32)26using IntDiffT = long long;27#else28using IntDiffT = long;29#endif30 31constexpr bool test() {32  // <iterator> - difference_type33  {34    // When "_Start" is signed integer like.35    {36      std::ranges::iota_view<int> io(0);37      auto iter1 = std::next(io.begin(), 10);38      auto iter2 = std::next(io.begin(), 10);39      assert(iter1 == iter2);40      assert(iter1 - 5 != iter2);41      assert(iter1 - 5 == std::ranges::prev(iter2, 5));42 43      static_assert(!std::is_reference_v<decltype(iter2 - 5)>);44    }45 46    // When "_Start" is not integer like.47    {48      std::ranges::iota_view io(SomeInt(0));49      auto iter1 = std::next(io.begin(), 10);50      auto iter2 = std::next(io.begin(), 10);51      assert(iter1 == iter2);52      assert(iter1 - 5 != iter2);53      assert(iter1 - 5 == std::ranges::prev(iter2, 5));54 55      static_assert(!std::is_reference_v<decltype(iter2 - 5)>);56    }57 58    // When "_Start" is unsigned integer like and n is greater than or equal to zero.59    {60      std::ranges::iota_view<unsigned> io(0);61      auto iter1 = std::next(io.begin(), 10);62      auto iter2 = std::next(io.begin(), 10);63      assert(iter1 == iter2);64      assert(iter1 - 5 != iter2);65      assert(iter1 - 5 == std::ranges::prev(iter2, 5));66 67      static_assert(!std::is_reference_v<decltype(iter2 - 5)>);68    }69    {70      std::ranges::iota_view<unsigned> io(0);71      auto iter1 = std::next(io.begin(), 10);72      auto iter2 = std::next(io.begin(), 10);73      assert(iter1 - 0 == iter2);74    }75 76    // When "_Start" is unsigned integer like and n is less than zero.77    {78      std::ranges::iota_view<unsigned> io(0);79      auto iter1 = std::next(io.begin(), 10);80      auto iter2 = std::next(io.begin(), 10);81      assert(iter1 - 5 != iter2);82      assert(iter1 - 5 == std::ranges::prev(iter2, 5));83 84      static_assert(!std::is_reference_v<decltype(iter2 - 5)>);85    }86  }87 88  // <iterator> - <iterator>89  {90    // When "_Start" is signed integer like.91    {92      std::ranges::iota_view<int> io(0);93      auto iter1 = std::next(io.begin(), 10);94      auto iter2 = std::next(io.begin(), 5);95      assert(iter1 - iter2 == 5);96 97      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);98    }99    {100      std::ranges::iota_view<int> io(0);101      auto iter1 = std::next(io.begin(), 10);102      auto iter2 = std::next(io.begin(), 10);103      assert(iter1 - iter2 == 0);104 105      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);106    }107    {108      std::ranges::iota_view<int> io(0);109      auto iter1 = std::next(io.begin(), 5);110      auto iter2 = std::next(io.begin(), 10);111      assert(iter1 - iter2 == -5);112 113      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);114    }115 116    // When "_Start" is unsigned integer like and y > x.117    {118      std::ranges::iota_view<unsigned> io(0);119      auto iter1 = std::next(io.begin(), 5);120      auto iter2 = std::next(io.begin(), 10);121      assert(iter1 - iter2 == -5);122 123      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);124    }125 126    // When "_Start" is unsigned integer like and x >= y.127    {128      std::ranges::iota_view<unsigned> io(0);129      auto iter1 = std::next(io.begin(), 10);130      auto iter2 = std::next(io.begin(), 5);131      assert(iter1 - iter2 == 5);132 133      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);134    }135    {136      std::ranges::iota_view<unsigned> io(0);137      auto iter1 = std::next(io.begin(), 10);138      auto iter2 = std::next(io.begin(), 10);139      assert(iter1 - iter2 == 0);140 141      LIBCPP_STATIC_ASSERT(std::same_as<decltype(iter1 - iter2), IntDiffT>);142    }143 144    // When "_Start" is not integer like.145    {146      std::ranges::iota_view io(SomeInt(0));147      auto iter1 = std::next(io.begin(), 10);148      auto iter2 = std::next(io.begin(), 5);149      assert(iter1 - iter2 == 5);150 151      static_assert(std::same_as<decltype(iter1 - iter2), int>);152    }153    {154      std::ranges::iota_view io(SomeInt(0));155      auto iter1 = std::next(io.begin(), 10);156      auto iter2 = std::next(io.begin(), 10);157      assert(iter1 - iter2 == 0);158 159      static_assert(std::same_as<decltype(iter1 - iter2), int>);160    }161    {162      std::ranges::iota_view io(SomeInt(0));163      auto iter1 = std::next(io.begin(), 5);164      auto iter2 = std::next(io.begin(), 10);165      assert(iter1 - iter2 == -5);166 167      static_assert(std::same_as<decltype(iter1 - iter2), int>);168    }169  }170 171  return true;172}173 174int main(int, char**) {175  test();176  static_assert(test());177 178  return 0;179}180