summaryrefslogtreecommitdiff
path: root/src/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/array.c')
-rw-r--r--src/array.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c
new file mode 100644
index 0000000..dde3eba
--- /dev/null
+++ b/src/array.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2025 Johnny Richard <johnny@johnnyrichard.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+#include <assert.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <obe/arena.h>
+#include <obe/array.h>
+
+void*
+obe_array_new(obe_arena_t* arena, size_t item_size)
+{
+ obe_array_header_t* h = obe_arena_alloc(
+ arena,
+ (item_size * OBE_ARRAY_INITIAL_CAPACITY) + sizeof(obe_array_header_t));
+ if (h == NULL) {
+ return NULL;
+ }
+ h->arena = arena;
+ h->length = 0;
+ h->item_size = item_size;
+ h->capacity = OBE_ARRAY_INITIAL_CAPACITY;
+
+ return ((uint8_t *)h) + sizeof(obe_array_header_t);
+}
+
+obe_array_header_t*
+obe_array_get_header(void* arr)
+{
+ return (obe_array_header_t*)(((uint8_t *)arr) - sizeof(obe_array_header_t));
+}
+
+void*
+obe_array_grow(void* arr)
+{
+ obe_array_header_t* h = obe_array_get_header(arr);
+
+ size_t old_size = sizeof(obe_array_header_t) + (h->capacity * h->item_size);
+ h->capacity *= 2;
+ size_t new_size = sizeof(obe_array_header_t) + (h->capacity * h->item_size);
+
+ h = obe_arena_realloc(h->arena, h, old_size, new_size);
+
+ return ((uint8_t *)h) + sizeof(obe_array_header_t);
+}
+
+size_t
+obe_array_length(void* arr)
+{
+ assert(arr);
+ obe_array_header_t* header = obe_array_get_header(arr);
+ return header->length;
+}