diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-08-15 03:01:04 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-08-15 03:01:04 -0400 |
| commit | 688f883e16e98a94c9654fa2bf6fc8257f01e2e6 (patch) | |
| tree | bd2bf0ea244eebaa308e5489fd99c418395def38 /builtins | |
| parent | 66ae30ac29d93ac7346bbb465e6c49f540ec4079 (diff) | |
Add array:find()
Diffstat (limited to 'builtins')
| -rw-r--r-- | builtins/array.c | 10 | ||||
| -rw-r--r-- | builtins/array.h | 2 |
2 files changed, 12 insertions, 0 deletions
diff --git a/builtins/array.c b/builtins/array.c index b310e43d..9c393699 100644 --- a/builtins/array.c +++ b/builtins/array.c @@ -211,6 +211,16 @@ public void Array$remove_item(array_t *arr, void *item, Int_t max_removals, cons } } +public Int_t Array$find(array_t arr, void *item, const TypeInfo *type) +{ + const TypeInfo *item_type = type->ArrayInfo.item; + for (int64_t i = 0; i < arr.length; i++) { + if (generic_equal(item, arr.data + i*arr.stride, item_type)) + return I(i+1); + } + return I(0); +} + public void Array$sort(array_t *arr, closure_t comparison, int64_t padded_item_size) { if (arr->data_refcount != 0 || (int64_t)arr->stride != padded_item_size) diff --git a/builtins/array.h b/builtins/array.h index 856bd07b..e4540340 100644 --- a/builtins/array.h +++ b/builtins/array.h @@ -61,6 +61,8 @@ void Array$insert_all(array_t *arr, array_t to_insert, Int_t index, int64_t padd void Array$remove_at(array_t *arr, Int_t index, Int_t count, int64_t padded_item_size); void Array$remove_item(array_t *arr, void *item, Int_t max_removals, const TypeInfo *type); #define Array$remove_item_value(arr, item_expr, max, type) ({ __typeof(item_expr) item = item_expr; Array$remove_item(arr, &item, max, type); }) +Int_t Array$find(array_t arr, void *item, const TypeInfo *type); +#define Array$find_value(arr, item_expr, type) ({ __typeof(item_expr) item = item_expr; Array$find(arr, &item, type); }) void Array$sort(array_t *arr, closure_t comparison, int64_t padded_item_size); array_t Array$sorted(array_t arr, closure_t comparison, int64_t padded_item_size); void Array$shuffle(array_t *arr, int64_t padded_item_size); |
