diff options
| -rw-r--r-- | pkarr.h | 14 | ||||
| -rw-r--r-- | test/pkarr.c | 25 |
2 files changed, 39 insertions, 0 deletions
@@ -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; } |
