aboutsummaryrefslogtreecommitdiff
path: root/lib/cbit/vec.c
blob: 21038a2cdfe8dc28d316bb0fbfbd644704120243 (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
#include "cbit/vec.h"
#include <stdio.h>

void vec_realloc_internal(struct vec_internal *vi, size_t new_capacity,
                          size_t esize) {
    size_t new_size = safe_mul(new_capacity, esize);
    if (vi->els == vi->storage) {
        void *new = malloc(new_size);
        memcpy(new, vi->els, vi->capacity * 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);
}