aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2023/lib/vec.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-01-27 14:02:35 +0800
committerMistivia <i@mistivia.com>2024-01-27 14:02:35 +0800
commit6580dcd9127f69aaa794472ec92bc46015dc4019 (patch)
treedc2c7e102c75180f7bd98c2f3a14f8b55f83c0f2 /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.c72
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++;
+}
+