blob: 2f875ffb0cbd96167d64f83e83a0372b29cf0a02 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include "cbit/vec.h"
#include <stdio.h>
#include <stdlib.h>
void vec_realloc_internal(struct vec_internal *vi, size_t new_capacity,
size_t esize) {
if (new_capacity == 0)
abort();
size_t new_size = safe_mul(new_capacity, esize);
if (vi->els == vi->storage) {
void *new = malloc(new_size);
size_t min_cap = new_capacity < vi->capacity ? new_capacity : vi->capacity;
memcpy(new, vi->els, min_cap * esize);
vi->els = new;
} else {
vi->els = realloc(vi->els, new_size);
}
vi->capacity = new_capacity;
}
void vec_realloc_internal_as_necessary(struct vec_internal *vi,
size_t min_capacity,
size_t esize) {
if (min_capacity > vi->capacity)
vec_realloc_internal(vi, safe_mul(vi->capacity, 2), esize);
else if (min_capacity < vi->capacity / 3)
vec_realloc_internal(vi, vi->capacity / 3, esize);
}
|