diff options
author | Ren Kararou <[email protected]> | 2025-01-31 02:12:09 -0600 |
---|---|---|
committer | Ren Kararou <[email protected]> | 2025-01-31 02:12:09 -0600 |
commit | 1dee936b1c7e7afd5760c181d99db34faa3cc8ad (patch) | |
tree | 5957e3e2f35fbb30e3d768d0f9650127f00ec9ef | |
parent | 7f6011bc44e0d7643b3f1eafefbd4fa1390c1661 (diff) | |
download | libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.gz libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.bz2 libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.zip |
impl resarr_swap()
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | inc/resarr.h | 2 | ||||
-rw-r--r-- | src/resarr.c | 50 |
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; |