brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · d92a44f Raw
89 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// <iterator>10 11// template <InputIterator Iter>12//   Iter::difference_type13//   distance(Iter first, Iter last); // constexpr in C++1714//15// template <RandomAccessIterator Iter>16//   Iter::difference_type17//   distance(Iter first, Iter last); // constexpr in C++1718 19#include <array>20#include <cassert>21#include <deque>22#include <iterator>23#include <vector>24#include <type_traits>25 26#include "test_macros.h"27#include "test_iterators.h"28 29template <class It>30TEST_CONSTEXPR_CXX17 void check_distance(It first, It last, typename std::iterator_traits<It>::difference_type dist) {31  typedef typename std::iterator_traits<It>::difference_type Difference;32  static_assert(std::is_same<decltype(std::distance(first, last)), Difference>::value, "");33  assert(std::distance(first, last) == dist);34}35 36#if TEST_STD_VER >= 2037/*TEST_CONSTEXPR_CXX26*/ void test_deque() { // TODO: Mark as TEST_CONSTEXPR_CXX26 once std::deque is constexpr38  using Container = std::deque<std::deque<double>>;39  Container c;40  auto view                    = c | std::views::join;41  Container::difference_type n = 0;42  for (std::size_t i = 0; i < 10; ++i) {43    n += i;44    c.push_back(Container::value_type(i));45  }46  assert(std::distance(view.begin(), view.end()) == n);47}48#endif49 50TEST_CONSTEXPR_CXX17 bool tests() {51  const char* s = "1234567890";52  check_distance(cpp17_input_iterator<const char*>(s), cpp17_input_iterator<const char*>(s + 10), 10);53  check_distance(forward_iterator<const char*>(s), forward_iterator<const char*>(s + 10), 10);54  check_distance(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s + 10), 10);55  check_distance(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s + 10), 10);56  check_distance(s, s + 10, 10);57 58#if TEST_STD_VER >= 2059  {60    using Container = std::vector<std::vector<int>>;61    Container c;62    auto view                    = c | std::views::join;63    Container::difference_type n = 0;64    for (std::size_t i = 0; i < 10; ++i) {65      n += i;66      c.push_back(Container::value_type(i));67    }68    assert(std::distance(view.begin(), view.end()) == n);69  }70  {71    using Container = std::array<std::array<char, 3>, 10>;72    Container c;73    auto view = c | std::views::join;74    assert(std::distance(view.begin(), view.end()) == 30);75  }76  if (!TEST_IS_CONSTANT_EVALUATED) // TODO: Use TEST_STD_AT_LEAST_26_OR_RUNTIME_EVALUATED when std::deque is made constexpr77    test_deque();78#endif79  return true;80}81 82int main(int, char**) {83  tests();84#if TEST_STD_VER >= 1785  static_assert(tests(), "");86#endif87  return 0;88}89