From 1677d7a1b901f9bf86b566de64339cefddf3c2bd Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 8 Mar 2024 13:00:29 -0500 Subject: Fix negative index issue and add array:random() --- builtins/array.c | 14 +++++++++++--- builtins/array.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/builtins/array.c b/builtins/array.c index ee583b5b..93c20bab 100644 --- a/builtins/array.c +++ b/builtins/array.c @@ -44,7 +44,7 @@ public void Array__compact(array_t *arr, const TypeInfo *type) public void Array__insert(array_t *arr, const void *item, int64_t index, const TypeInfo *type) { - if (index < 1) index = arr->length - index + 1; + if (index < 1) index = arr->length + index; if (index < 1) index = 1; else if (index > (int64_t)arr->length + 1) index = (int64_t)arr->length + 1; @@ -79,7 +79,7 @@ public void Array__insert(array_t *arr, const void *item, int64_t index, const T public void Array__insert_all(array_t *arr, array_t to_insert, int64_t index, const TypeInfo *type) { - if (index < 1) index = arr->length - index + 1; + if (index < 1) index = arr->length + index; if (index < 1) index = 1; else if (index > (int64_t)arr->length + 1) index = (int64_t)arr->length + 1; @@ -112,7 +112,7 @@ public void Array__insert_all(array_t *arr, array_t to_insert, int64_t index, co public void Array__remove(array_t *arr, int64_t index, int64_t count, const TypeInfo *type) { - if (index < 1) index = arr->length - index + 1; + if (index < 1) index = arr->length + index; if (index < 1 || index > (int64_t)arr->length || count < 1) return; @@ -171,6 +171,14 @@ public void Array__shuffle(array_t *arr, const TypeInfo *type) } } +public void *Array_random(array_t arr) +{ + if (arr.length == 0) + return NULL; // fail("Cannot get a random item from an empty array!"); + uint32_t index = arc4random_uniform(arr.length); + return arr.data + arr.stride*index; +} + public array_t Array__slice(array_t *array, int64_t first, int64_t stride, int64_t length, const TypeInfo *type) { if (stride > MAX_STRIDE || stride < MIN_STRIDE) diff --git a/builtins/array.h b/builtins/array.h index 8b7b3b40..c61b03a2 100644 --- a/builtins/array.h +++ b/builtins/array.h @@ -51,6 +51,7 @@ void Array__insert_all(array_t *arr, array_t to_insert, int64_t index, const Typ void Array__remove(array_t *arr, int64_t index, int64_t count, const TypeInfo *type); void Array__sort(array_t *arr, const TypeInfo *type); void Array__shuffle(array_t *arr, const TypeInfo *type); +void *Array_random(array_t arr); void Array__clear(array_t *array, const TypeInfo *type); void Array__compact(array_t *arr, const TypeInfo *type); bool Array__contains(array_t array, void *item, const TypeInfo *type); -- cgit v1.2.3