diff options
Diffstat (limited to 'pkarr.h')
| -rw-r--r-- | pkarr.h | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -25,6 +25,13 @@ void pk_arr_remove_at(struct pk_arr *arr, uint32_t index); void pk_arr_clone(struct pk_arr *lhs, struct pk_arr *rhs); void pk_arr_swap(struct pk_arr *lhs, struct pk_arr *rhs); uint32_t pk_arr_find_first_index(struct pk_arr *arr, void *user_data, pk_arr_item_compare *fn); +#ifdef PK_IMPL_ITER +#include "pkiter.h" /*deleteme*/ +bool pk_arr_iter_begin(struct pk_arr *arr, struct pk_iter *it); +bool pk_arr_iter_end(struct pk_arr *arr, struct pk_iter *it); +bool pk_arr_iter_increment(struct pk_arr *arr, struct pk_iter *it); +bool pk_arr_iter_decrement(struct pk_arr *arr, struct pk_iter *it); +#endif /* PK_IMPL_ITER */ #if defined(__cplusplus) template<typename T> @@ -294,4 +301,50 @@ pk_arr_find_first_index(struct pk_arr *arr, void *user_data, pk_arr_item_compare return -1; } +#ifdef PK_IMPL_ITER + +bool +pk_arr_iter_begin(struct pk_arr *arr, struct pk_iter *it) { + it->data = nullptr; + it->id.arr.i = 0; + if (arr->data != nullptr && arr->data != CAFE_BABE(void)) { + it->data = arr->data; + return true; + } + return false; +} + +bool pk_arr_iter_end(struct pk_arr *arr, struct pk_iter *it) { + it->data = nullptr; + it->id.arr.i = 0; + if (arr->data != nullptr && arr->data != CAFE_BABE(void)) { + it->id.arr.i = arr->next - 1; + it->data = (void *)((char*)arr->data + (arr->stride * it->id.arr.i)); + return true; + } + return false; +} + +bool +pk_arr_iter_increment(struct pk_arr *arr, struct pk_iter *it) { + if (it->id.arr.i + 1 >= arr->next) { + return false; + } + it->id.arr.i += 1; + it->data = (void *)((char*)arr->data + (arr->stride * it->id.arr.i)); + return true; +} + +bool +pk_arr_iter_decrement(struct pk_arr *arr, struct pk_iter *it) { + if (it->id.arr.i == 0) { + return false; + } + it->id.arr.i -= 1; + it->data = (void *)((char*)arr->data + (arr->stride * it->id.arr.i)); + return true; +} + +#endif /* PK_IMPL_ITER */ + #endif /* PK_IMPL_ARR */ |
