aboutsummaryrefslogtreecommitdiff
path: root/src/std/vec.c
blob: 077e64a76205927aec5bc512c5320432580faf74 (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 <string.h>

#include "assert.h"
#include "types.h"
#include "vec.h"

Vec _Vec_new(Arena *a, size tsize, size cap, size align) {
    assert(cap > 0, "negative cap");
    Vec v = {0};
    v.tsize = tsize;
    v.cap = cap;
    v.align = align;
    v.len = 0;
    v.data = alloc(a, cap, tsize, align);
    return v;
}

void Vec_push(Arena *a, Vec *v, void *data) {
    if (v->len == v->cap) {
        void *cpy = alloc(a, v->cap * 2, v->tsize, v->align);
        memcpy(cpy, v->data, v->len * v->tsize);
        v->cap *= 2;
        v->data = cpy;
    }
    memcpy(v->data + v->len * v->tsize, data, v->tsize);
    v->len++;
}