diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-04-02 13:08:06 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-04-02 13:08:06 -0400 |
| commit | c73e96ff916209d74e2be9bd7d8de3758685ce4d (patch) | |
| tree | 8f902fea5b6790061e48600243f0f8faeded32dd /builtins | |
| parent | b6534ce34706d1a98584e5f916107d91da072346 (diff) | |
Add comparison operator <> and array method to sort by a custom
comparison function
Diffstat (limited to 'builtins')
| -rw-r--r-- | builtins/array.c | 4 | ||||
| -rw-r--r-- | builtins/array.h | 2 | ||||
| -rw-r--r-- | builtins/functions.c | 2 | ||||
| -rw-r--r-- | builtins/table.c | 4 |
4 files changed, 6 insertions, 6 deletions
diff --git a/builtins/array.c b/builtins/array.c index 8b50dbcf..84b65ae7 100644 --- a/builtins/array.c +++ b/builtins/array.c @@ -138,7 +138,7 @@ public void Array$remove(array_t *arr, int64_t index, int64_t count, const TypeI arr->length -= count; } -public void Array$sort(array_t *arr, const TypeInfo *type) +public void Array$sort(array_t *arr, closure_t comparison, const TypeInfo *type) { const TypeInfo *item_type = type->ArrayInfo.item; int64_t item_size = item_type->size; @@ -148,7 +148,7 @@ public void Array$sort(array_t *arr, const TypeInfo *type) if (arr->data_refcount || (int64_t)arr->stride != item_size) Array$compact(arr, type); - qsort_r(arr->data, arr->length, item_size, (void*)generic_compare, (void*)item_type); + qsort_r(arr->data, arr->length, item_size, comparison.fn, comparison.userdata); } public void Array$shuffle(array_t *arr, const TypeInfo *type) diff --git a/builtins/array.h b/builtins/array.h index 98638222..7b432194 100644 --- a/builtins/array.h +++ b/builtins/array.h @@ -56,7 +56,7 @@ void Array$insert(array_t *arr, const void *item, int64_t index, const TypeInfo *type); void Array$insert_all(array_t *arr, array_t to_insert, int64_t index, const TypeInfo *type); 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$sort(array_t *arr, closure_t comparison, const TypeInfo *type); void Array$shuffle(array_t *arr, const TypeInfo *type); void *Array$random(array_t arr); void Array$clear(array_t *array); diff --git a/builtins/functions.c b/builtins/functions.c index 53c4db0f..aa410b74 100644 --- a/builtins/functions.c +++ b/builtins/functions.c @@ -164,7 +164,7 @@ public void $test(void *expr, const TypeInfo *type, CORD expected, const char *f if (!success) { fail_source(filename, start, end, - USE_COLOR ? "\x1b[31;1mDoctest failure:\nExpected: \x1b[32;1m%s\x1b[0m\n\x1b[31;1m But got: \x1b[31;7m%s\x1b[0m\n" + USE_COLOR ? "\x1b[31;1mDoctest failure:\nExpected: \x1b[32;1m%s\x1b[0m\n\x1b[31;1m But got:\x1b[m %s\n" : "Doctest failure:\nExpected: %s\n But got: %s\n", CORD_to_const_char_star(expected), CORD_to_const_char_star(expr_normalized)); } diff --git a/builtins/table.c b/builtins/table.c index 32bf6858..956c0565 100644 --- a/builtins/table.c +++ b/builtins/table.c @@ -441,8 +441,8 @@ public int32_t Table$compare(const table_t *x, const table_t *y, const TypeInfo return (x->entries.length > y->entries.length) - (x->entries.length < y->entries.length); array_t x_entries = x->entries, y_entries = y->entries; - Array$sort(&x_entries, table.key); - Array$sort(&y_entries, table.key); + Array$sort(&x_entries, (closure_t){.fn=generic_compare, .userdata=(void*)table.key}, table.key); + Array$sort(&y_entries, (closure_t){.fn=generic_compare, .userdata=(void*)table.key}, table.key); for (int64_t i = 0; i < x_entries.length; i++) { void *x_key = x_entries.data + x_entries.stride * i; void *y_key = y_entries.data + y_entries.stride * i; |
