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