aboutsummaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-04-02 13:08:06 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-04-02 13:08:06 -0400
commitc73e96ff916209d74e2be9bd7d8de3758685ce4d (patch)
tree8f902fea5b6790061e48600243f0f8faeded32dd /builtins
parentb6534ce34706d1a98584e5f916107d91da072346 (diff)
Add comparison operator <> and array method to sort by a custom
comparison function
Diffstat (limited to 'builtins')
-rw-r--r--builtins/array.c4
-rw-r--r--builtins/array.h2
-rw-r--r--builtins/functions.c2
-rw-r--r--builtins/table.c4
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;