diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2024-03-18 19:56:20 +0100 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2024-03-29 11:39:38 +0100 |
commit | a52f1121a3589af8f89828e04d66f1215c361bcf (patch) | |
tree | e0ee847774d45b3efa7376eefd775e43a30bcf0f /src/fns.c | |
parent | 1232ab31c656b8564984a758957466f90ac10501 (diff) | |
download | emacs-a52f1121a3589af8f89828e04d66f1215c361bcf.tar.gz |
Add back timsort key function handling (bug#69709)
The original timsort code did provide for a key (accessor) function
along with the necessary storage management, but we dropped it because
our `sort` function didn't need it.
Now it's been put back since it seems that it will come in handy after all.
* src/fns.c (sort_list, sort_vector, Fsort): Pass Qnil as key function
to tim_sort.
* src/sort.c (reverse_slice, sortslice_copy)
(sortslice_copy_incr, sortslice_copy_decr, sortslice_memcpy)
(sortslice_memmove, sortslice_advance): New functions.
(sortslice): New type.
(struct stretch, struct reloc, merge_state)
(binarysort, merge_init, merge_markmem, cleanup_mem)
(merge_register_cleanup, merge_getmem, merge_lo, merge_hi, merge_at)
(found_new_run, reverse_sortslice, resolve_fun, tim_sort):
Merge back previously discarded parts from the upstreams timsort code
that dealt with key functions, and adapt them to fit in.
Diffstat (limited to 'src/fns.c')
-rw-r--r-- | src/fns.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/fns.c b/src/fns.c index 7faf25b9088..a3ef99f67a8 100644 --- a/src/fns.c +++ b/src/fns.c @@ -2353,7 +2353,7 @@ See also the function `nreverse', which is used more often. */) is destructively reused to hold the sorted result. */ static Lisp_Object -sort_list (Lisp_Object list, Lisp_Object predicate) +sort_list (Lisp_Object list, Lisp_Object predicate, Lisp_Object keyfunc) { ptrdiff_t length = list_length (list); if (length < 2) @@ -2369,7 +2369,7 @@ sort_list (Lisp_Object list, Lisp_Object predicate) result[i] = Fcar (tail); tail = XCDR (tail); } - tim_sort (predicate, result, length); + tim_sort (predicate, keyfunc, result, length); ptrdiff_t i = 0; tail = list; @@ -2388,13 +2388,13 @@ sort_list (Lisp_Object list, Lisp_Object predicate) algorithm. */ static void -sort_vector (Lisp_Object vector, Lisp_Object predicate) +sort_vector (Lisp_Object vector, Lisp_Object predicate, Lisp_Object keyfunc) { ptrdiff_t length = ASIZE (vector); if (length < 2) return; - tim_sort (predicate, XVECTOR (vector)->contents, length); + tim_sort (predicate, keyfunc, XVECTOR (vector)->contents, length); } DEFUN ("sort", Fsort, Ssort, 2, 2, 0, @@ -2406,9 +2406,9 @@ the second. */) (Lisp_Object seq, Lisp_Object predicate) { if (CONSP (seq)) - seq = sort_list (seq, predicate); + seq = sort_list (seq, predicate, Qnil); else if (VECTORP (seq)) - sort_vector (seq, predicate); + sort_vector (seq, predicate, Qnil); else if (!NILP (seq)) wrong_type_argument (Qlist_or_vector_p, seq); return seq; |