diff options
| -rw-r--r-- | src/array.c | 5 | ||||
| -rw-r--r-- | tests/array.c | 78 |
2 files changed, 83 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c index 5175d6f..cbeb256 100644 --- a/src/array.c +++ b/src/array.c @@ -14,6 +14,8 @@ #define al_array_init(arr) ((arr).size = 0, (arr).alloc = 0, (arr).data = NULL) #define al_array_item_size(arr) (sizeof(*(arr).data)) // NOLINT(bugprone-sizeof-expression) +#define al_array_is_empty(arr) ((arr).size == 0) + #define al_array_at(arr, i) ((arr).data[i]) #define al_array_last(arr) al_array_at(arr, (arr).size - 1) @@ -77,6 +79,9 @@ #define al_array_foreach(arr, i, item) \ for (u32 i = 0; (i < (arr).size && (item = al_array_at(arr, i), 1)); i++) +#define al_array_foreach_rev(arr, i, item) \ + for (u32 i = (arr).size; (i-- > 0 && (item = al_array_at(arr, i), 1));) + #define al_array_foreach_ptr(arr, i, item) \ for (u32 i = 0; (i < (arr).size && (item = &al_array_at(arr, i), 1)); i++) diff --git a/tests/array.c b/tests/array.c index 722aab6..79664cc 100644 --- a/tests/array.c +++ b/tests/array.c @@ -238,6 +238,83 @@ static bool array_test_insert(void) AL_TEST_END(); } +static bool array_test_foreach(void) +{ + AL_TEST_START("array_foreach"); + + array(u32) arr; + al_array_init(arr); + + al_array_push(arr, 0); + al_array_push(arr, 1); + al_array_push(arr, 2); + al_array_push(arr, 3); + al_array_push(arr, 4); + al_array_push(arr, 5); + + u32 iter0; + al_array_foreach(arr, i, iter0) { + AL_TEST_EQ(iter0, i, u32); + } + + u32 iter1; + al_array_foreach_rev(arr, i, iter1) { + AL_TEST_EQ(iter1, i, u32); + } + + u32 *ptr0; + al_array_foreach_ptr(arr, i, ptr0) { + AL_TEST_EQ(*ptr0, i, u32); + } + + u32 iter2; + al_array_foreach_rev(arr, i, iter2) { + AL_TEST_EQ(iter2, i, u32); + al_array_remove_at(arr, i); + } + + AL_TEST_EQ(arr.size, 0, u32); + + al_array_push(arr, 0); + al_array_push(arr, 1); + al_array_push(arr, 2); + al_array_push(arr, 3); + al_array_push(arr, 4); + al_array_push(arr, 5); + al_array_push(arr, 6); + al_array_push(arr, 7); + al_array_push(arr, 8); + al_array_push(arr, 9); + + u32 iter3, count0 = 0; + al_array_foreach(arr, i, iter3) { + AL_TEST_EQ(iter3, count0, u32); + count0++; + al_array_remove_at_iter(arr, i); + } + + al_array_push(arr, 0); + al_array_push(arr, 1); + al_array_push(arr, 2); + al_array_push(arr, 3); + al_array_push(arr, 4); + al_array_push(arr, 5); + al_array_push(arr, 6); + al_array_push(arr, 7); + al_array_push(arr, 8); + al_array_push(arr, 9); + + u32 iter4; + al_array_foreach(arr, i, iter4) { + AL_TEST_EQ(iter4, i + i, u32); + al_array_remove_at(arr, i); + } + + al_array_free(arr); + + AL_TEST_END(); +} + bool array_tests_run(void) { AL_TEST_START_GROUP("array"); @@ -251,6 +328,7 @@ bool array_tests_run(void) AL_TEST_RUN(array_test_remove_at); AL_TEST_RUN(array_test_pop_at); AL_TEST_RUN(array_test_insert); + AL_TEST_RUN(array_test_foreach); AL_TEST_END_GROUP(); } |