aboutsummaryrefslogtreecommitdiff
path: root/vec.c
blob: a8fd57acd8a642fe70e0860c0e3334dfa451b415 (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 "vec.h"

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

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

void *_Vec_get(Vec *v, int pos) { return v->data + v->size * pos; }