diff options
| author | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
| commit | 6580dcd9127f69aaa794472ec92bc46015dc4019 (patch) | |
| tree | dc2c7e102c75180f7bd98c2f3a14f8b55f83c0f2 /advent-of-code/2023/lib/vec.c | |
init
Diffstat (limited to 'advent-of-code/2023/lib/vec.c')
| -rw-r--r-- | advent-of-code/2023/lib/vec.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/advent-of-code/2023/lib/vec.c b/advent-of-code/2023/lib/vec.c new file mode 100644 index 0000000..c3d8a0a --- /dev/null +++ b/advent-of-code/2023/lib/vec.c @@ -0,0 +1,72 @@ +#include "vec.h" + +#include <string.h> +#include "stdlib.h" + +struct vec { + size_t length; + size_t capacity; + void** buf; +}; + +static void vec_enlarge(struct vec* self) { + self->buf = realloc(self->buf, self->capacity * sizeof(void*) * 2); + self->capacity = self->capacity * 2; +} + +void *new_vec() { + struct vec* vec = malloc(sizeof(struct vec)); + vec->length = 0; + vec->capacity = 16; + vec->buf = malloc(16 * sizeof(void*)); + return vec; +} + +void vec_push_back(void *self_, void* obj) { + struct vec *self = self_; + if (self->length == self->capacity) vec_enlarge(self); + self->buf[self->length] = obj; + self->length++; +} + +void* vec_get(void *self_, size_t n) { + struct vec *self = self_; + if (n < 0 || n >= self->length) return NULL; + return self->buf[n]; +} + + +void vec_erase(void *self_, size_t n) { + struct vec *self = self_; + if (self->length <= n) { + return; + } + memmove(self->buf + n, self->buf + n + 1, (self->length - n - 1) * sizeof(void*)); + self->length--; +} + +size_t vec_size(void *self_) { + struct vec *self = self_; + return self->length; +} + +void vec_reserve(void *self_, size_t n) { + struct vec *self = self_; + if (n <= self->capacity) { + return; + } + self->buf = malloc(sizeof(void*) * n); + self->capacity = n; +} + +void vec_insert(void *self_, size_t pos, void *obj) { + struct vec *self = self_; + if (self->length == self->capacity) { + vec_enlarge(self); + } + if (pos > self->length || pos < 0) return; + memmove(self->buf + pos + 1, self->buf + pos, sizeof(void*) * (self->length - pos)); + self->buf[pos] = obj; + self->length++; +} + |
