about summary refs log tree commit diff stats
path: root/src/resarr.c
diff options
context:
space:
mode:
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;
+}
+