about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2025-01-31 02:21:05 -0600
committerRen Kararou <[email protected]>2025-01-31 02:21:05 -0600
commitae54c5df759e69f7d70dc19476359ceb1796fec7 (patch)
treeb913d8556724f2c904ca1781f3a58f87559cafac
parent1dee936b1c7e7afd5760c181d99db34faa3cc8ad (diff)
downloadlibspicy-ae54c5df759e69f7d70dc19476359ceb1796fec7.tar.gz
libspicy-ae54c5df759e69f7d70dc19476359ceb1796fec7.tar.bz2
libspicy-ae54c5df759e69f7d70dc19476359ceb1796fec7.zip
impl resarr_swap_quick()
-rw-r--r--inc/resarr.h1
-rw-r--r--src/resarr.c15
2 files changed, 16 insertions, 0 deletions
diff --git a/inc/resarr.h b/inc/resarr.h
index e3b853f..0a4ed23 100644
--- a/inc/resarr.h
+++ b/inc/resarr.h
@@ -22,6 +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_quick_swap(stype_resarr *first, stype_resarr *second);
 int resarr_clear(stype_resarr *arr);
 int resarr_destroy(stype_resarr *arr);
 
diff --git a/src/resarr.c b/src/resarr.c
index a597d86..a359d71 100644
--- a/src/resarr.c
+++ b/src/resarr.c
@@ -99,6 +99,21 @@ int resarr_swap(stype_resarr *first, stype_resarr *second) {
 	return 0;
 }
 
+int resarr_swap_quick(stype_resarr *first, stype_resarr *second) {
+	if (first == NULL || second == NULL) return -1;
+	if (first->elemsize != second->elemsize) return -1;
+	size_t size = first->elemcount;
+	size_t alloc = first->allocsize;
+	void *array = first->array;
+	first->elemcount = second->elemcount;
+	first->allocsize = second->allocsize;
+	first->array = second->array;
+	second->elemcount = size;
+	second->allocsize = alloc;
+	second->array = array;
+	return 0;
+}
+
 int resarr_clear(stype_resarr *arr) {
 	if (arr == NULL) return -1;
 	memset(