diff options
| author | 2024-10-19 11:30:46 -0400 | |
|---|---|---|
| committer | 2024-10-19 11:30:46 -0400 | |
| commit | 736f15908cf34a851140094897a13ff12d55fd0c (patch) | |
| tree | 190ff424e4dc7ef1db3cda803be14fe06cc8a302 | |
| parent | e23e7af2ae14073f7fec7c8992976f9ae9e489c8 (diff) | |
| download | libalabaster-736f15908cf34a851140094897a13ff12d55fd0c.tar.gz libalabaster-736f15908cf34a851140094897a13ff12d55fd0c.tar.bz2 libalabaster-736f15908cf34a851140094897a13ff12d55fd0c.zip | |
array: Add remove_range() + tests
Signed-off-by: Andrew Opalach <andrew@akon.city>
| -rw-r--r-- | src/array.c | 9 | ||||
| -rw-r--r-- | tests/array.c | 34 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c index 8803c54..2b06d23 100644 --- a/src/array.c +++ b/src/array.c @@ -74,6 +74,15 @@ } \ } while (0) +#define al_array_remove_range(arr, i, e) \ + do { \ + if (e != (arr).size) { \ + al_memmove(&al_array_at(arr, i), &al_array_at(arr, e), \ + al_array_item_size(arr) * ((arr).size - e)); \ + } \ + (arr).size -= e - i; \ + } while (0) + #if AL_USE_STDLIB #define al_array_sort(arr, type, cmp) AL_STDLIB_QSORT((arr).data, type, (arr).size, cmp) #else diff --git a/tests/array.c b/tests/array.c index 6ac3845..1e70074 100644 --- a/tests/array.c +++ b/tests/array.c @@ -163,6 +163,39 @@ static bool array_test_remove_at(void) AL_TEST_END(); } +static bool array_test_remove_range(void) +{ + AL_TEST_START("array_remove_range"); + + array(u32) arr; + al_array_init(arr); + al_array_reserve(arr, 12); + + u32 array_before[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + u32 array_after[] = { 1, 3, 4, 7, 8, 11 }; + + for (u32 i = 0; i < sizeof(array_before) / sizeof(u32); i++) { + al_array_push(arr, array_before[i]); + } + + al_array_remove_range(arr, 1, 2); + al_array_remove_range(arr, 3, 5); + AL_TEST_EQ(arr.size, 9, u32); + al_array_remove_range(arr, 5, 7); + AL_TEST_EQ(arr.size, 7, u32); + al_array_remove_range(arr, 6, 7); + + AL_TEST_EQ(arr.size, (u32)(sizeof(array_after) / sizeof(u32)), u32); + + for (u32 i = 0; i < sizeof(array_after) / sizeof(u32); i++) { + AL_TEST_EQ(al_array_at(arr, i), array_after[i], u32); + } + + al_array_free(arr); + + AL_TEST_END(); +} + static bool array_test_pop_at(void) { AL_TEST_START("array_pop_at"); @@ -355,6 +388,7 @@ bool array_tests_run(void) AL_TEST_RUN(array_test_push); AL_TEST_RUN(array_test_pop); AL_TEST_RUN(array_test_remove_at); + AL_TEST_RUN(array_test_remove_range); AL_TEST_RUN(array_test_pop_at); AL_TEST_RUN(array_test_insert); AL_TEST_RUN(array_test_foreach); |