brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 91788b3 Raw
94 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// <vector>10 11// template <class InputIt>12// constexpr void assign(InputIt first, InputIt last);13 14#include <vector>15#include <cassert>16#include "test_macros.h"17#include "test_iterators.h"18 19TEST_CONSTEXPR_CXX20 bool tests() {20  {   // Test with various cases where assign may or may not trigger reallocations for forward_iterator21    { // Reallocation happens22      std::vector<bool> in(128, true);23      std::vector<bool> v(5, false);24      assert(v.capacity() < in.size());25      using It = forward_iterator<std::vector<bool>::iterator>;26      v.assign(It(in.begin()), It(in.end()));27      assert(v == in);28    }29    { // No reallocation: fit within current size30      bool in[]     = {false, true, false, true, true};31      std::size_t N = sizeof(in) / sizeof(in[0]);32      std::vector<bool> v(2 * N, false);33      using It = forward_iterator<bool*>;34      v.assign(It(in), It(in + N));35      assert(v.size() == N);36      for (std::size_t i = 0; i < N; ++i)37        assert(v[i] == in[i]);38    }39    { // No reallocation: fit within spare space40      bool in[]     = {false, true, false, true, true};41      std::size_t N = sizeof(in) / sizeof(in[0]);42      std::vector<bool> v(N / 2, false);43      v.reserve(N * 2);44      using It = forward_iterator<bool*>;45      v.assign(It(in), It(in + N));46      assert(v.size() == N);47      for (std::size_t i = 0; i < N; ++i)48        assert(v[i] == in[i]);49    }50  }51 52  {   // Test with various cases where assign may or may not trigger reallocations for input_iterator53    { // Reallocation happens54      std::vector<bool> in(128, true);55      std::vector<bool> v(5, false);56      assert(v.capacity() < in.size());57      using It = cpp17_input_iterator<std::vector<bool>::iterator>;58      v.assign(It(in.begin()), It(in.end()));59      assert(v == in);60    }61    { // No reallocation: fit within current size62      bool in[]     = {false, true, false, true, true};63      std::size_t N = sizeof(in) / sizeof(in[0]);64      std::vector<bool> v(2 * N, false);65      using It = cpp17_input_iterator<bool*>;66      v.assign(It(in), It(in + N));67      assert(v.size() == N);68      for (std::size_t i = 0; i < N; ++i)69        assert(v[i] == in[i]);70    }71    { // No reallocation: fit within spare space72      bool in[]     = {false, true, false, true, true};73      std::size_t N = sizeof(in) / sizeof(in[0]);74      std::vector<bool> v(N / 2, false);75      v.reserve(N * 2);76      using It = cpp17_input_iterator<bool*>;77      v.assign(It(in), It(in + N));78      assert(v.size() == N);79      for (std::size_t i = 0; i < N; ++i)80        assert(v[i] == in[i]);81    }82  }83 84  return true;85}86 87int main(int, char**) {88  tests();89#if TEST_STD_VER > 1790  static_assert(tests());91#endif92  return 0;93}94