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 /src/resarr.c | |
parent | 7f6011bc44e0d7643b3f1eafefbd4fa1390c1661 (diff) | |
download | libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.gz libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.tar.bz2 libspicy-1dee936b1c7e7afd5760c181d99db34faa3cc8ad.zip |
impl resarr_swap()
Diffstat (limited to 'src/resarr.c')
-rw-r--r-- | src/resarr.c | 50 |
1 files changed, 49 insertions, 1 deletions
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; |