summaryrefslogtreecommitdiff
path: root/pkarr.h
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-01-10 10:14:08 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-01-10 10:14:08 -0500
commit89c7dc0951a00d49a5678ed90e728f4f64ebe928 (patch)
treeac4de776679950d0d6aa2ff5658242a35e7ce070 /pkarr.h
parent79e040d203e63ec79bb124215dcd1e940f7b676c (diff)
pkarr: PK_ARR_MOVE_IN_PLACE shift correct byte range
Diffstat (limited to 'pkarr.h')
-rw-r--r--pkarr.h45
1 files changed, 41 insertions, 4 deletions
diff --git a/pkarr.h b/pkarr.h
index 3d05e77..fa2d88a 100644
--- a/pkarr.h
+++ b/pkarr.h
@@ -80,14 +80,39 @@ pk_arr_move_to_back(struct pk_arr *arr, uint32_t index)
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;
+ char *target = (char *)pk_new(arr->stride, arr->alignment, arr->bkt);
+ char *buffer = (char *)arr->data;
+ // copy bytes to temp buffer
for (ii = 0, i = arr->stride * index; ii < arr->stride; ++ii, ++i) {
target[ii] = buffer[i];
}
+ // shift everything forward
+ // arr->stride = 8
+ // arr->next = 2
+ // index = 0
+ //
+ // for (i = 0; i < 8; ++i) {
+ // b[i] = b[i + 8]
+ // }
+ // b[00] = b[08]
+ // b[01] = b[09]
+ // ...
+ // b[07] = b[15]
for (i = arr->stride * index; i < (arr->stride * (arr->next - 1)); ++i) {
buffer[i] = buffer[i + arr->stride];
}
+ // copy temp buffer back into arr
+ // arr->stride = 8
+ // arr->next = 2
+ // index = 0
+ //
+ // for (ii = 0, i = 8; ii < 8; ++ii, ++i) {
+ // b[i] = t[ii]
+ // }
+ // b[08] = t[00]
+ // b[09] = t[01]
+ // ...
+ // b[15] = t[07]
for (ii = 0, i = arr->stride * (arr->next - 1); ii < arr->stride; ++ii, ++i) {
buffer[i] = target[ii];
}
@@ -138,8 +163,20 @@ pk_arr_remove_at(struct pk_arr *arr, uint32_t index)
}
#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) {
+ char *buffer = (char *)arr->data;
+ // shift everything forward
+ // arr->stride = 8
+ // arr->next = 3
+ // index = 0
+ //
+ // for (i = 0; i < 16; ++i) {
+ // b[i] = b[i + 8]
+ // }
+ // b[00] = b[08]
+ // b[01] = b[09]
+ // ...
+ // b[15] = b[23]
+ for (i = arr->stride * index; i < arr->stride * arr->next; ++i) {
buffer[i] = buffer[i + arr->stride];
}
#else