aboutsummaryrefslogtreecommitdiff
path: root/lib/cbit/vec.c
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);
}