about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2025-01-31 02:12:09 -0600
committerRen Kararou <[email protected]>2025-01-31 02:12:09 -0600
commit1dee936b1c7e7afd5760c181d99db34faa3cc8ad (patch)
tree5957e3e2f35fbb30e3d768d0f9650127f00ec9ef
parent7f6011bc44e0d7643b3f1eafefbd4fa1390c1661 (diff)
downloadlibspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.gz
libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.bz2
libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.zip
impl resarr_swap()
-rw-r--r--.gitignore1
-rw-r--r--inc/resarr.h2
-rw-r--r--src/resarr.c50
3 files changed, 51 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 96b6b5d..71472d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
 .\#*
 
 # artefacts
+*.a
 *.o
 *.so
 *.pch
diff --git a/inc/resarr.h b/inc/resarr.h
index 92a1f85..e3b853f 100644
--- a/inc/resarr.h
+++ b/inc/resarr.h
@@ -22,7 +22,7 @@ int resarr_insert(stype_resarr *arr, void *elem, size_t before, size_t count);
 int resarr_insert_single(stype_resarr *arr, void *elem, size_t before);
 int resarr_delete(stype_resarr *arr, size_t start, size_t end);
 int resarr_swap(stype_resarr *first, stype_resarr *second);
-int resarr_clear(stype_resarr arr);
+int resarr_clear(stype_resarr *arr);
 int resarr_destroy(stype_resarr *arr);
 
 #endif
diff --git a/src/resarr.c b/src/resarr.c
index 4a72217..a597d86 100644
--- a/src/resarr.c
+++ b/src/resarr.c
@@ -60,7 +60,55 @@ size_t resarr_size(stype_resarr arr) {
 	return arr.elemcount;
 }
 
-// TODO: insert{,_single}, delete, swap, clear
+// TODO: insert{,_single}, delete
+
+int resarr_swap(stype_resarr *first, stype_resarr *second) {
+	if (first == NULL || second == NULL) return -1;
+	if (first->elemsize != second->elemsize) return -1;
+	size_t size = first->elemsize;
+	size_t largest = 0;
+	if (first->elemcount > second->elemcount) {
+		largest = first->elemcount;
+		resarr_reserve(second, first->elemcount);
+	} else {
+		largest = second->elemcount;
+		resarr_reserve(first, second->elemcount);
+	}
+	// There has got to be a better way to do this...
+	stype_resarr uwu = resarr_create(size);
+	resarr_reserve_exact(&uwu, largest);
+	uwu.elemcount = first->elemcount;
+	memcpy(
+		(uintptr_t *)uwu.array,
+		(uintptr_t *)first->array,
+		size
+	);
+	first->elemcount = second->elemcount;
+	memcpy(
+		(uintptr_t *)first->array,
+		(uintptr_t *)second->array,
+		size
+	);
+	second->elemcount = uwu.elemcount;
+	memcpy(
+		(uintptr_t *)second->array,
+		(uintptr_t *)uwu.array,
+		size
+	);
+	resarr_destroy(&uwu);
+	return 0;
+}
+
+int resarr_clear(stype_resarr *arr) {
+	if (arr == NULL) return -1;
+	memset(
+		((uintptr_t *)arr->array),
+		0,
+		arr->elemsize * arr->elemcount
+	);
+	arr->elemcount = 0;
+	return 0;
+}
 
 int resarr_destroy(stype_resarr *arr) {
 	if (arr == NULL) return -1;