aboutsummaryrefslogtreecommitdiff
path: root/lib/vec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vec.c')
-rw-r--r--lib/vec.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/vec.c b/lib/vec.c
new file mode 100644
index 0000000..551f679
--- /dev/null
+++ b/lib/vec.c
@@ -0,0 +1,38 @@
+/* Copyright (C) 2025 Aryadev Chavali
+
+ * 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 Version 2 for
+ * details.
+
+ * You may distribute and modify this code under the terms of the GNU General
+ * Public License Version 2, which you should have received a copy of along with
+ * this program. If not, please go to <https://www.gnu.org/licenses/>.
+
+ * Created: 2025-04-15
+ * Description: Vector implementation
+ */
+
+#include <lib/vec.h>
+
+#include <malloc.h>
+#include <string.h>
+
+void vec_reserve(arena_t *allocator, vec_t *vec, u32 size)
+{
+ if (vec->cap - vec->size < size)
+ {
+ u32 old_cap = vec->cap;
+ vec->cap = MAX(vec->cap * 1.5, vec->size + size);
+ vec->data = arena_realloc(allocator, vec->data, old_cap, vec->cap);
+ }
+}
+
+u32 vec_append(arena_t *allocator, vec_t *vec, const void *data, u32 size)
+{
+ vec_reserve(allocator, vec, size);
+ memcpy(vec->data + vec->size, data, size);
+ u32 ptr = vec->size;
+ vec->size += size;
+ return ptr;
+}