| 130 |
130 |
| 131 // determine size and capacity |
131 // determine size and capacity |
| 132 size_t oldcap; |
132 size_t oldcap; |
| 133 size_t oldsize; |
133 size_t oldsize; |
| 134 size_t max_size; |
134 size_t max_size; |
| 135 if (width == 0 || width == 8*sizeof(size_t)) { |
135 if (width == 0 || width == sizeof(size_t)) { |
| 136 oldcap = *(size_t*) capacity; |
136 oldcap = *(size_t*) capacity; |
| 137 oldsize = *(size_t*) size; |
137 oldsize = *(size_t*) size; |
| 138 max_size = SIZE_MAX; |
138 max_size = SIZE_MAX; |
| 139 } else if (width == 16) { |
139 } else if (width == sizeof(uint16_t)) { |
| 140 oldcap = *(uint16_t*) capacity; |
140 oldcap = *(uint16_t*) capacity; |
| 141 oldsize = *(uint16_t*) size; |
141 oldsize = *(uint16_t*) size; |
| 142 max_size = UINT16_MAX; |
142 max_size = UINT16_MAX; |
| 143 } else if (width == 8) { |
143 } else if (width == sizeof(uint8_t)) { |
| 144 oldcap = *(uint8_t*) capacity; |
144 oldcap = *(uint8_t*) capacity; |
| 145 oldsize = *(uint8_t*) size; |
145 oldsize = *(uint8_t*) size; |
| 146 max_size = UINT8_MAX; |
146 max_size = UINT8_MAX; |
| 147 } |
147 } |
| 148 #if CX_WORDSIZE == 64 |
148 #if CX_WORDSIZE == 64 |
| 149 else if (width == 32) { |
149 else if (width == sizeof(uint32_t)) { |
| 150 oldcap = *(uint32_t*) capacity; |
150 oldcap = *(uint32_t*) capacity; |
| 151 oldsize = *(uint32_t*) size; |
151 oldsize = *(uint32_t*) size; |
| 152 max_size = UINT32_MAX; |
152 max_size = UINT32_MAX; |
| 153 } |
153 } |
| 154 #endif |
154 #endif |
| 184 |
184 |
| 185 // store new pointer |
185 // store new pointer |
| 186 *array = newmem; |
186 *array = newmem; |
| 187 |
187 |
| 188 // store new capacity |
188 // store new capacity |
| 189 if (width == 0 || width == 8*sizeof(size_t)) { |
189 if (width == 0 || width == sizeof(size_t)) { |
| 190 *(size_t*) capacity = newcap; |
190 *(size_t*) capacity = newcap; |
| 191 } else if (width == 16) { |
191 } else if (width == sizeof(uint16_t)) { |
| 192 *(uint16_t*) capacity = (uint16_t) newcap; |
192 *(uint16_t*) capacity = (uint16_t) newcap; |
| 193 } else if (width == 8) { |
193 } else if (width == sizeof(uint8_t)) { |
| 194 *(uint8_t*) capacity = (uint8_t) newcap; |
194 *(uint8_t*) capacity = (uint8_t) newcap; |
| 195 } |
195 } |
| 196 #if CX_WORDSIZE == 64 |
196 #if CX_WORDSIZE == 64 |
| 197 else if (width == 32) { |
197 else if (width == sizeof(uint32_t)) { |
| 198 *(uint32_t*) capacity = (uint32_t) newcap; |
198 *(uint32_t*) capacity = (uint32_t) newcap; |
| 199 } |
199 } |
| 200 #endif |
200 #endif |
| 201 } |
201 } |
| 202 |
202 |
| 223 |
223 |
| 224 // determine size and capacity |
224 // determine size and capacity |
| 225 size_t oldcap; |
225 size_t oldcap; |
| 226 size_t oldsize; |
226 size_t oldsize; |
| 227 size_t max_size; |
227 size_t max_size; |
| 228 if (width == 0 || width == 8*sizeof(size_t)) { |
228 if (width == 0 || width == sizeof(size_t)) { |
| 229 oldcap = *(size_t*) capacity; |
229 oldcap = *(size_t*) capacity; |
| 230 oldsize = *(size_t*) size; |
230 oldsize = *(size_t*) size; |
| 231 max_size = SIZE_MAX; |
231 max_size = SIZE_MAX; |
| 232 } else if (width == 16) { |
232 } else if (width == sizeof(uint16_t)) { |
| 233 oldcap = *(uint16_t*) capacity; |
233 oldcap = *(uint16_t*) capacity; |
| 234 oldsize = *(uint16_t*) size; |
234 oldsize = *(uint16_t*) size; |
| 235 max_size = UINT16_MAX; |
235 max_size = UINT16_MAX; |
| 236 } else if (width == 8) { |
236 } else if (width == sizeof(uint8_t)) { |
| 237 oldcap = *(uint8_t*) capacity; |
237 oldcap = *(uint8_t*) capacity; |
| 238 oldsize = *(uint8_t*) size; |
238 oldsize = *(uint8_t*) size; |
| 239 max_size = UINT8_MAX; |
239 max_size = UINT8_MAX; |
| 240 } |
240 } |
| 241 #if CX_WORDSIZE == 64 |
241 #if CX_WORDSIZE == 64 |
| 242 else if (width == 32) { |
242 else if (width == sizeof(uint32_t)) { |
| 243 oldcap = *(uint32_t*) capacity; |
243 oldcap = *(uint32_t*) capacity; |
| 244 oldsize = *(uint32_t*) size; |
244 oldsize = *(uint32_t*) size; |
| 245 max_size = UINT32_MAX; |
245 max_size = UINT32_MAX; |
| 246 } |
246 } |
| 247 #endif |
247 #endif |
| 301 // note: no overflow check here, b/c we cannot get here w/o allocation |
301 // note: no overflow check here, b/c we cannot get here w/o allocation |
| 302 memmove(start, src, elem_count * elem_size); |
302 memmove(start, src, elem_count * elem_size); |
| 303 |
303 |
| 304 // if any of size or capacity changed, store them back |
304 // if any of size or capacity changed, store them back |
| 305 if (newsize != oldsize || newcap != oldcap) { |
305 if (newsize != oldsize || newcap != oldcap) { |
| 306 if (width == 0 || width == 8*sizeof(size_t)) { |
306 if (width == 0 || width == sizeof(size_t)) { |
| 307 *(size_t*) capacity = newcap; |
307 *(size_t*) capacity = newcap; |
| 308 *(size_t*) size = newsize; |
308 *(size_t*) size = newsize; |
| 309 } else if (width == 16) { |
309 } else if (width == sizeof(uint16_t)) { |
| 310 *(uint16_t*) capacity = (uint16_t) newcap; |
310 *(uint16_t*) capacity = (uint16_t) newcap; |
| 311 *(uint16_t*) size = (uint16_t) newsize; |
311 *(uint16_t*) size = (uint16_t) newsize; |
| 312 } else if (width == 8) { |
312 } else if (width == sizeof(uint8_t)) { |
| 313 *(uint8_t*) capacity = (uint8_t) newcap; |
313 *(uint8_t*) capacity = (uint8_t) newcap; |
| 314 *(uint8_t*) size = (uint8_t) newsize; |
314 *(uint8_t*) size = (uint8_t) newsize; |
| 315 } |
315 } |
| 316 #if CX_WORDSIZE == 64 |
316 #if CX_WORDSIZE == 64 |
| 317 else if (width == 32) { |
317 else if (width == sizeof(uint32_t)) { |
| 318 *(uint32_t*) capacity = (uint32_t) newcap; |
318 *(uint32_t*) capacity = (uint32_t) newcap; |
| 319 *(uint32_t*) size = (uint32_t) newsize; |
319 *(uint32_t*) size = (uint32_t) newsize; |
| 320 } |
320 } |
| 321 #endif |
321 #endif |
| 322 } |
322 } |