/Users/alexjokela/projects/lattice/src/ds/vec.c
Line | Count | Source |
1 | | #include "ds/vec.h" |
2 | | #include <stdlib.h> |
3 | | #include <string.h> |
4 | | |
5 | 11.3k | #define INITIAL_CAP 8 |
6 | | |
7 | 12.9k | LatVec lat_vec_new(size_t elem_size) { |
8 | 12.9k | LatVec v; |
9 | 12.9k | v.data = NULL; |
10 | 12.9k | v.len = 0; |
11 | 12.9k | v.cap = 0; |
12 | 12.9k | v.elem_size = elem_size; |
13 | 12.9k | return v; |
14 | 12.9k | } |
15 | | |
16 | 12.9k | void lat_vec_free(LatVec *v) { |
17 | 12.9k | free(v->data); |
18 | 12.9k | v->data = NULL; |
19 | 12.9k | v->len = 0; |
20 | 12.9k | v->cap = 0; |
21 | 12.9k | } |
22 | | |
23 | 19.2k | static void lat_vec_grow(LatVec *v) { |
24 | 19.2k | size_t new_cap = v->cap == 0 ? INITIAL_CAP : v->cap * 2; |
25 | 19.2k | v->data = realloc(v->data, new_cap * v->elem_size); |
26 | 19.2k | v->cap = new_cap; |
27 | 19.2k | } |
28 | | |
29 | 500k | void lat_vec_push(LatVec *v, const void *elem) { |
30 | 500k | if (v->len >= v->cap) { |
31 | 19.2k | lat_vec_grow(v); |
32 | 19.2k | } |
33 | 500k | memcpy((char *)v->data + v->len * v->elem_size, elem, v->elem_size); |
34 | 500k | v->len++; |
35 | 500k | } |
36 | | |
37 | 39.2k | bool lat_vec_pop(LatVec *v, void *out) { |
38 | 39.2k | if (v->len == 0) return false; |
39 | 39.2k | v->len--; |
40 | 39.2k | if (out) { |
41 | 3 | memcpy(out, (char *)v->data + v->len * v->elem_size, v->elem_size); |
42 | 3 | } |
43 | 39.2k | return true; |
44 | 39.2k | } |
45 | | |
46 | 465k | void *lat_vec_get(const LatVec *v, size_t index) { |
47 | 465k | if (index >= v->len) return NULL; |
48 | 465k | return (char *)v->data + index * v->elem_size; |
49 | 465k | } |
50 | | |
51 | 3 | void lat_vec_set(LatVec *v, size_t index, const void *elem) { |
52 | 3 | if (index >= v->len) return; |
53 | 3 | memcpy((char *)v->data + index * v->elem_size, elem, v->elem_size); |
54 | 3 | } |
55 | | |
56 | 0 | void lat_vec_clear(LatVec *v) { |
57 | 0 | v->len = 0; |
58 | 0 | } |
59 | | |
60 | 0 | void lat_vec_reserve(LatVec *v, size_t cap) { |
61 | 0 | if (cap <= v->cap) return; |
62 | 0 | v->data = realloc(v->data, cap * v->elem_size); |
63 | 0 | v->cap = cap; |
64 | 0 | } |