summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/array.c5
-rw-r--r--tests/array.c78
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();
}