1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <vector> 11 12 // template <class Iter> 13 // iterator insert(const_iterator position, Iter first, Iter last); 14 15 #if _LIBCPP_DEBUG >= 1 16 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) 17 #endif 18 19 #include <vector> 20 #include <cassert> 21 #include "../../../stack_allocator.h" 22 #include "test_iterators.h" 23 #include "min_allocator.h" 24 #include "asan_testing.h" 25 26 int main() 27 { 28 { 29 std::vector<int> v(100); 30 int a[] = {1, 2, 3, 4, 5}; 31 const int N = sizeof(a)/sizeof(a[0]); 32 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a), 33 input_iterator<const int*>(a+N)); 34 assert(v.size() == 100 + N); 35 assert(is_contiguous_container_asan_correct(v)); 36 assert(i == v.begin() + 10); 37 int j; 38 for (j = 0; j < 10; ++j) 39 assert(v[j] == 0); 40 for (int k = 0; k < N; ++j, ++k) 41 assert(v[j] == a[k]); 42 for (; j < 105; ++j) 43 assert(v[j] == 0); 44 } 45 { 46 std::vector<int> v(100); 47 int a[] = {1, 2, 3, 4, 5}; 48 const int N = sizeof(a)/sizeof(a[0]); 49 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a), 50 forward_iterator<const int*>(a+N)); 51 assert(v.size() == 100 + N); 52 assert(is_contiguous_container_asan_correct(v)); 53 assert(i == v.begin() + 10); 54 int j; 55 for (j = 0; j < 10; ++j) 56 assert(v[j] == 0); 57 for (int k = 0; k < N; ++j, ++k) 58 assert(v[j] == a[k]); 59 for (; j < 105; ++j) 60 assert(v[j] == 0); 61 } 62 { 63 std::vector<int> v(100); 64 while(v.size() < v.capacity()) v.push_back(0); // force reallocation 65 size_t sz = v.size(); 66 int a[] = {1, 2, 3, 4, 5}; 67 const unsigned N = sizeof(a)/sizeof(a[0]); 68 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a), 69 forward_iterator<const int*>(a+N)); 70 assert(v.size() == sz + N); 71 assert(i == v.begin() + 10); 72 int j; 73 for (j = 0; j < 10; ++j) 74 assert(v[j] == 0); 75 for (int k = 0; k < N; ++j, ++k) 76 assert(v[j] == a[k]); 77 for (; j < v.size(); ++j) 78 assert(v[j] == 0); 79 } 80 { 81 std::vector<int> v(100); 82 v.reserve(128); // force no reallocation 83 size_t sz = v.size(); 84 int a[] = {1, 2, 3, 4, 5}; 85 const unsigned N = sizeof(a)/sizeof(a[0]); 86 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a), 87 forward_iterator<const int*>(a+N)); 88 assert(v.size() == sz + N); 89 assert(i == v.begin() + 10); 90 int j; 91 for (j = 0; j < 10; ++j) 92 assert(v[j] == 0); 93 for (int k = 0; k < N; ++j, ++k) 94 assert(v[j] == a[k]); 95 for (; j < v.size(); ++j) 96 assert(v[j] == 0); 97 } 98 { 99 std::vector<int, stack_allocator<int, 308> > v(100); 100 int a[] = {1, 2, 3, 4, 5}; 101 const int N = sizeof(a)/sizeof(a[0]); 102 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a), 103 input_iterator<const int*>(a+N)); 104 assert(v.size() == 100 + N); 105 assert(is_contiguous_container_asan_correct(v)); 106 assert(i == v.begin() + 10); 107 int j; 108 for (j = 0; j < 10; ++j) 109 assert(v[j] == 0); 110 for (int k = 0; k < N; ++j, ++k) 111 assert(v[j] == a[k]); 112 for (; j < 105; ++j) 113 assert(v[j] == 0); 114 } 115 { 116 std::vector<int, stack_allocator<int, 300> > v(100); 117 int a[] = {1, 2, 3, 4, 5}; 118 const int N = sizeof(a)/sizeof(a[0]); 119 std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a), 120 forward_iterator<const int*>(a+N)); 121 assert(v.size() == 100 + N); 122 assert(is_contiguous_container_asan_correct(v)); 123 assert(i == v.begin() + 10); 124 int j; 125 for (j = 0; j < 10; ++j) 126 assert(v[j] == 0); 127 for (int k = 0; k < N; ++j, ++k) 128 assert(v[j] == a[k]); 129 for (; j < 105; ++j) 130 assert(v[j] == 0); 131 } 132 #if _LIBCPP_DEBUG >= 1 133 { 134 std::vector<int> v(100); 135 std::vector<int> v2(100); 136 int a[] = {1, 2, 3, 4, 5}; 137 const int N = sizeof(a)/sizeof(a[0]); 138 std::vector<int>::iterator i = v.insert(v2.cbegin() + 10, input_iterator<const int*>(a), 139 input_iterator<const int*>(a+N)); 140 assert(false); 141 } 142 #endif 143 #if __cplusplus >= 201103L 144 { 145 std::vector<int, min_allocator<int>> v(100); 146 int a[] = {1, 2, 3, 4, 5}; 147 const int N = sizeof(a)/sizeof(a[0]); 148 std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a), 149 input_iterator<const int*>(a+N)); 150 assert(v.size() == 100 + N); 151 assert(is_contiguous_container_asan_correct(v)); 152 assert(i == v.begin() + 10); 153 int j; 154 for (j = 0; j < 10; ++j) 155 assert(v[j] == 0); 156 for (int k = 0; k < N; ++j, ++k) 157 assert(v[j] == a[k]); 158 for (; j < 105; ++j) 159 assert(v[j] == 0); 160 } 161 { 162 std::vector<int, min_allocator<int>> v(100); 163 int a[] = {1, 2, 3, 4, 5}; 164 const int N = sizeof(a)/sizeof(a[0]); 165 std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a), 166 forward_iterator<const int*>(a+N)); 167 assert(v.size() == 100 + N); 168 assert(is_contiguous_container_asan_correct(v)); 169 assert(i == v.begin() + 10); 170 int j; 171 for (j = 0; j < 10; ++j) 172 assert(v[j] == 0); 173 for (int k = 0; k < N; ++j, ++k) 174 assert(v[j] == a[k]); 175 for (; j < 105; ++j) 176 assert(v[j] == 0); 177 } 178 #if _LIBCPP_DEBUG >= 1 179 { 180 std::vector<int, min_allocator<int>> v(100); 181 std::vector<int, min_allocator<int>> v2(100); 182 int a[] = {1, 2, 3, 4, 5}; 183 const int N = sizeof(a)/sizeof(a[0]); 184 std::vector<int, min_allocator<int>>::iterator i = v.insert(v2.cbegin() + 10, input_iterator<const int*>(a), 185 input_iterator<const int*>(a+N)); 186 assert(false); 187 } 188 #endif 189 #endif 190 } 191