diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-12-06 09:58:33 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-12-06 16:26:12 -0500 |
| commit | e804e84ff900393d2fe7121c701fa61b28b3758f (patch) | |
| tree | 4c2feba8edd2076fd05110f8d08004f68751b407 /pkarr.h | |
| parent | 4b18e25ed6c4e506f8182e091fc355a7b013a788 (diff) | |
pkarr: PK_ARR_MOVE_IN_PLACE
Diffstat (limited to 'pkarr.h')
| -rw-r--r-- | pkarr.h | 34 |
1 files changed, 31 insertions, 3 deletions
@@ -22,7 +22,9 @@ void pk_arr_append(struct pk_arr *arr, void *data); void pk_arr_remove_at(struct pk_arr *arr, uint32_t index); #endif /* PK_PKARR_H */ -#ifdef PK_IMPL_ARR +#ifdef PK_IMPL_ARR + +#include "./pkmacros.h" /* deleteme */ #ifndef PK_ARR_GROW_RATIO #define PK_ARR_GROW_RATIO 1.5 @@ -52,7 +54,9 @@ pk_arr_reserve(struct pk_arr *arr, uint32_t count) if (arr->reserved >= count) return; void *new_data = pk_new(arr->stride * count, arr->alignment, arr->bkt); if (arr->data != NULL) { - memcpy(new_data, arr->data, arr->stride * arr->reserved); + if (arr->next != 0) { + memcpy(new_data, arr->data, arr->stride * arr->reserved); + } pk_delete(arr->data, arr->stride * arr->reserved, arr->bkt); } arr->reserved = count; @@ -71,6 +75,21 @@ pk_arr_move_to_back(struct pk_arr *arr, uint32_t index) { if (arr->reserved == 0) return; if (arr->next <= 1) return; +#ifdef PK_ARR_MOVE_IN_PLACE + uint32_t i, ii; + uint8_t *target = (uint8_t *)pk_new(arr->stride, arr->alignment, arr->bkt); + uint8_t *buffer = (uint8_t *)arr->data; + for (ii = 0, i = arr->stride * index; ii < arr->stride; ++ii, ++i) { + target[ii] = buffer[i]; + } + for (i = arr->stride * index; i < (arr->stride * (arr->next - 1)); ++i) { + buffer[i] = buffer[i + arr->stride]; + } + for (ii = 0, i = arr->stride * (arr->next - 1); ii < arr->stride; ++ii, ++i) { + buffer[i] = target[ii]; + } + pk_delete(target, arr->stride, arr->bkt); +#else char *new_data = (char *)pk_new(arr->stride * arr->reserved, arr->alignment, arr->bkt); if (index > 0) { memcpy(new_data, arr->data, arr->stride * index); @@ -85,13 +104,14 @@ pk_arr_move_to_back(struct pk_arr *arr, uint32_t index) arr->stride * (arr->next - index - 1)); pk_delete(arr->data, arr->stride * arr->reserved, arr->bkt); arr->data = (void *)new_data; +#endif } void pk_arr_append(struct pk_arr *arr, void *data) { if (arr->reserved == arr->next) { - uint32_t new_count = arr->reserved == 0 ? PK_ARR_INITIAL_COUNT : arr->reserved * PK_ARR_GROW_RATIO; + uint32_t new_count = PK_MAX(arr->reserved == 0 ? PK_ARR_INITIAL_COUNT : arr->reserved * PK_ARR_GROW_RATIO, arr->reserved + 1); void *new_data = pk_new(arr->stride * new_count, arr->alignment, arr->bkt); if (arr->data != NULL) { memcpy(new_data, arr->data, arr->stride * arr->reserved); @@ -113,6 +133,13 @@ pk_arr_remove_at(struct pk_arr *arr, uint32_t index) arr->next -=1; return; } +#ifdef PK_ARR_MOVE_IN_PLACE + uint32_t i; + uint8_t *buffer = (uint8_t *)arr->data; + for (i = arr->stride * index; i < (arr->stride * (arr->next - 1)); ++i) { + buffer[i] = buffer[i + arr->stride]; + } +#else char *new_data = (char *)pk_new(arr->stride * arr->reserved, arr->alignment, arr->bkt); if (index > 0) { memcpy(new_data, arr->data, arr->stride * index); @@ -123,6 +150,7 @@ pk_arr_remove_at(struct pk_arr *arr, uint32_t index) arr->stride * (arr->next - index - 1)); pk_delete(arr->data, arr->stride * arr->reserved, arr->bkt); arr->data = (void *)new_data; +#endif arr->next -= 1; } |
