brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · c57eb9d Raw
150 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// <deque>10 11// template <class InputIterator>12//   void assign(InputIterator f, InputIterator l);13 14#include "asan_testing.h"15#include <deque>16#include <cassert>17#include <cstddef>18 19#include "test_macros.h"20#include "test_iterators.h"21#include "min_allocator.h"22#if TEST_STD_VER >= 1123#  include "emplace_constructible.h"24#endif25 26template <class C>27C make(int size, int start = 0) {28  const int b = 4096 / sizeof(int);29  int init    = 0;30  if (start > 0) {31    init = (start + 1) / b + ((start + 1) % b != 0);32    init *= b;33    --init;34  }35  C c(init, 0);36  for (int i = 0; i < init - start; ++i)37    c.pop_back();38  for (int i = 0; i < size; ++i)39    c.push_back(i);40  for (int i = 0; i < start; ++i)41    c.pop_front();42  return c;43}44 45template <class C>46void test(C& c1, const C& c2) {47  c1.assign(c2.begin(), c2.end());48  assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());49  assert(c1 == c2);50  LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));51  LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));52}53 54template <class C>55void testN(int start, int N, int M) {56  C c1 = make<C>(N, start);57  C c2 = make<C>(M);58  test(c1, c2);59}60 61template <class C>62void testI(C& c1, const C& c2) {63  typedef typename C::const_iterator CI;64  typedef cpp17_input_iterator<CI> ICI;65  c1.assign(ICI(c2.begin()), ICI(c2.end()));66  assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());67  assert(c1 == c2);68  LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c1));69  LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(c2));70}71 72template <class C>73void testNI(int start, int N, int M) {74  C c1 = make<C>(N, start);75  C c2 = make<C>(M);76  testI(c1, c2);77}78 79void basic_test() {80  {81    int rng[]   = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};82    const int N = sizeof(rng) / sizeof(rng[0]);83    for (int i = 0; i < N; ++i)84      for (int j = 0; j < N; ++j)85        for (int k = 0; k < N; ++k)86          testN<std::deque<int> >(rng[i], rng[j], rng[k]);87    testNI<std::deque<int> >(1500, 2000, 1000);88  }89#if TEST_STD_VER >= 1190  {91    int rng[]   = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};92    const int N = sizeof(rng) / sizeof(rng[0]);93    for (int i = 0; i < N; ++i)94      for (int j = 0; j < N; ++j)95        for (int k = 0; k < N; ++k)96          testN<std::deque<int, min_allocator<int>> >(rng[i], rng[j], rng[k]);97    testNI<std::deque<int, min_allocator<int>> >(1500, 2000, 1000);98  }99  {100    int rng[]   = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};101    const int N = sizeof(rng) / sizeof(rng[0]);102    for (int i = 0; i < N; ++i)103      for (int j = 0; j < N; ++j)104        for (int k = 0; k < N; ++k)105          testN<std::deque<int, safe_allocator<int>> >(rng[i], rng[j], rng[k]);106    testNI<std::deque<int, safe_allocator<int>> >(1500, 2000, 1000);107  }108#endif109}110 111template <class It>112void test_emplacable_concept() {113#if TEST_STD_VER >= 11114  int arr1[] = {42};115  int arr2[] = {1, 101, 42};116  {117    using T = EmplaceConstructibleMoveableAndAssignable<int>;118    {119      std::deque<T> v;120      v.assign(It(arr1), It(std::end(arr1)));121      assert(v[0].value == 42);122    }123    {124      std::deque<T> v;125      v.assign(It(arr2), It(std::end(arr2)));126      assert(v[0].value == 1);127      assert(v[1].value == 101);128      assert(v[2].value == 42);129    }130  }131#endif132}133 134void test_iterators() {135  test_emplacable_concept<cpp17_input_iterator<int*> >();136  test_emplacable_concept<forward_iterator<int*> >();137  test_emplacable_concept<bidirectional_iterator<int*> >();138  test_emplacable_concept<random_access_iterator<int*> >();139#if TEST_STD_VER > 17140  test_emplacable_concept<contiguous_iterator<int*> >();141#endif142  test_emplacable_concept<int*>();143}144 145int main(int, char**) {146  basic_test();147 148  return 0;149}150