summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkarr.h14
-rw-r--r--test/pkarr.c25
2 files changed, 39 insertions, 0 deletions
diff --git a/pkarr.h b/pkarr.h
index f92cd9f..3d05e77 100644
--- a/pkarr.h
+++ b/pkarr.h
@@ -13,6 +13,8 @@ struct pk_arr {
void *data;
};
+typedef bool(pk_arr_item_compare)(void *user_data, void *item);
+
void pk_arr_clear(struct pk_arr *arr);
void pk_arr_reset(struct pk_arr *arr);
void pk_arr_reserve(struct pk_arr *arr, uint32_t count);
@@ -20,6 +22,7 @@ void pk_arr_resize(struct pk_arr *arr, uint32_t count);
void pk_arr_move_to_back(struct pk_arr *arr, uint32_t index);
void pk_arr_append(struct pk_arr *arr, void *data);
void pk_arr_remove_at(struct pk_arr *arr, uint32_t index);
+uint32_t pk_arr_find_first_index(struct pk_arr *arr, void *user_data, pk_arr_item_compare *fn);
#endif /* PK_PKARR_H */
#ifdef PK_IMPL_ARR
@@ -154,4 +157,15 @@ pk_arr_remove_at(struct pk_arr *arr, uint32_t index)
arr->next -= 1;
}
+uint32_t
+pk_arr_find_first_index(struct pk_arr *arr, void *user_data, pk_arr_item_compare *fn)
+{
+ uint32_t i;
+ char *char_data = (char *)arr->data;
+ for (i = 0; i < arr->next; ++i) {
+ if (fn(user_data, char_data + (arr->stride * i))) return i;
+ }
+ return -1;
+}
+
#endif /* PK_IMPL_ARR */
diff --git a/test/pkarr.c b/test/pkarr.c
index 97757dc..bbc3411 100644
--- a/test/pkarr.c
+++ b/test/pkarr.c
@@ -31,6 +31,12 @@ test_teardown(struct pk_arr *arr, struct pk_membucket **bkt)
arr->data = NULL;
}
+bool
+find_uint8(void *user_data, void *item)
+{
+ return memcmp(user_data, item, sizeof(uint8_t)) == 0;
+}
+
int main(int argc, char *argv[])
{
(void)argc;
@@ -207,5 +213,24 @@ int main(int argc, char *argv[])
test_teardown(&arr, &bkt);
}
+ // init via append, soft clear
+ {
+ test_spinup(&arr, &bkt);
+ arr.stride = sizeof(uint8_t);
+ arr.alignment = alignof(uint8_t);
+
+ uint8_t c1 = 127;
+ uint8_t c2 = 128;
+ pk_arr_append(&arr, &c1);
+
+ i = pk_arr_find_first_index(&arr, &c1, find_uint8);
+ if (0 != i) exit(1);
+
+ i = pk_arr_find_first_index(&arr, &c2, find_uint8);
+ if (0xFFFFFFFF != i) exit(1);
+
+ test_teardown(&arr, &bkt);
+ }
+
return 0;
}