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-exception 6 // 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 19 TEST_CONSTEXPR_CXX20 bool tests() { 20 { // Test with various cases where assign may or may not trigger reallocations for forward_iterator 21 { // Reallocation happens 22 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 size 30 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 space 40 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_iterator 53 { // Reallocation happens 54 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 size 62 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 space 72 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 87 int main(int, char**) { 88 tests(); 89 #if TEST_STD_VER > 17 90 static_assert(tests()); 91 #endif 92 return 0; 93 } 94