about summary refs log tree commit diff stats
path: root/src/resarr.c
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2025-01-31 01:34:25 -0600
committerRen Kararou <[email protected]>2025-01-31 01:34:25 -0600
commit7f6011bc44e0d7643b3f1eafefbd4fa1390c1661 (patch)
treea2e6980561800fc70ad36642ebd19eccf5ff343a /src/resarr.c
parent46ac53232eaec4c9e52ba42524c9a749090d963f (diff)
downloadlibspicy-7f6011bc44e0d7643b3f1eafefbd4fa1390c1661.tar.gz
libspicy-7f6011bc44e0d7643b3f1eafefbd4fa1390c1661.tar.bz2
libspicy-7f6011bc44e0d7643b3f1eafefbd4fa1390c1661.zip
implement the easy parts of resizable array
Diffstat (limited to 'src/resarr.c')
-rw-r--r--src/resarr.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/resarr.c b/src/resarr.c
new file mode 100644
index 0000000..4a72217
--- /dev/null
+++ b/src/resarr.c
@@ -0,0 +1,73 @@
+#include "resarr.h"
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+stype_resarr resarr_create(size_t elemsize) {
+	return (stype_resarr) { .elemsize = elemsize, .elemcount = 0, .allocsize = 0, .array = NULL };
+}
+
+int resarr_reserve(stype_resarr *arr, size_t elemcount) {
+	if (arr == NULL) return -1;
+	size_t ec = 1;
+	while (ec < elemcount) {
+		ec *= 2;
+	}
+	if (ec * arr->elemsize < arr->allocsize) return -1;
+	arr->array = realloc(arr->array, (ec * arr->elemsize));
+	if (arr->array == NULL) return -1;
+	arr->allocsize = ec * arr->elemsize;
+	return 0;
+}
+
+int resarr_reserve_exact(stype_resarr *arr, size_t elemcount) {
+	if (arr == NULL) return -1;
+	if (elemcount * arr->elemsize < arr->allocsize) return -1;
+	arr->array = realloc(arr->array, (elemcount * arr->elemsize));
+	if (arr->array == NULL) return -1;
+	arr->allocsize = elemcount * arr->elemsize;
+	return 0;
+}
+
+int resarr_push(stype_resarr *arr, void *elem) {
+	if (arr == NULL) return -1;
+	if (arr->elemsize * arr->elemcount == arr->allocsize) {
+		arr->array = realloc(arr->array, (arr->allocsize * 2));
+		if (arr->array == NULL) return -1;
+		arr->allocsize *= 2;
+	}
+	memcpy(
+		((uintptr_t *)arr->array + (arr->elemsize * arr->elemcount)),
+		(uintptr_t *)elem,
+		arr->elemsize
+	);
+	return 0;
+}
+
+int resarr_pop(stype_resarr *arr) {
+	if (arr == NULL) return -1;
+	if (arr->array == NULL) return -1;
+	memset(
+		((uintptr_t *)arr->array + (arr->elemsize * arr->elemcount)),
+		0,
+		arr->elemsize
+	);
+	return 0;
+}
+
+size_t resarr_size(stype_resarr arr) {
+	return arr.elemcount;
+}
+
+// TODO: insert{,_single}, delete, swap, clear
+
+int resarr_destroy(stype_resarr *arr) {
+	if (arr == NULL) return -1;
+	free(arr->array);
+	arr->elemcount = 0;
+	arr->elemsize = 0;
+	arr->allocsize = 0;
+	return 0;
+}
+