summaryrefslogtreecommitdiff
path: root/include/obe/array.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/obe/array.h')
-rw-r--r--include/obe/array.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/include/obe/array.h b/include/obe/array.h
new file mode 100644
index 0000000..4ef9204
--- /dev/null
+++ b/include/obe/array.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2025 Johnny Richard <johnny@johnnyrichard.com>
+ *
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ *
+ * This file is part of obe.
+ *
+ * obe is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * obe 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 Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with obe. If not, see <https://www.gnu.org/licenses/>.
+ */
+#ifndef OBE_ARRAY_H
+#define OBE_ARRAY_H
+#include <obe/arena.h>
+#include <stddef.h>
+
+#define OBE_ARRAY_INITIAL_CAPACITY 4
+
+#define obe_array(arena, T) (T*)obe_array_new((arena), sizeof(T))
+
+#define obe_array_append(arr, item) \
+ do { \
+ obe_array_header_t* h = obe_array_get_header(arr); \
+ if (h->capacity < h->length + 1) { \
+ arr = obe_array_grow(arr); \
+ h = obe_array_get_header(arr); \
+ } \
+ arr[h->length++] = item; \
+ } while (0)
+
+typedef struct obe_array_header
+{
+ obe_arena_t* arena;
+ size_t capacity;
+ size_t item_size;
+ size_t length;
+} obe_array_header_t;
+
+void*
+obe_array_new(obe_arena_t* arena, size_t item_size);
+
+obe_array_header_t*
+obe_array_get_header(void* arr);
+
+void*
+obe_array_grow(void* arr);
+
+size_t
+obe_array_length(void* arr);
+
+#endif /* OBE_ARRAY_H */