From 7ea899191fc61f03b1532b7ba65107fcc8df6792 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 19 Sep 2025 14:37:14 +0800 Subject: [PATCH] slice_sorted: Incrementally preserve sorting instead of always resorting --- ds/map/slice_sorted/del.ha | 1 - ds/map/slice_sorted/internal.ha | 6 ------ ds/map/slice_sorted/set.ha | 7 +++++-- diff --git a/ds/map/slice_sorted/del.ha b/ds/map/slice_sorted/del.ha index 6f72396a359e7d2be7d765cd38362f5e02cc340d..3dd5078a79a331b1dc73ed14582ae0e83525de73 100644 --- a/ds/map/slice_sorted/del.ha +++ b/ds/map/slice_sorted/del.ha @@ -10,7 +10,6 @@ (&probe: const *opaque), &cmp_kv)) { case let idx: size => let v = m.items[idx].1; delete(m.items[idx]); - resort(m); return v; case void => return; diff --git a/ds/map/slice_sorted/internal.ha b/ds/map/slice_sorted/internal.ha index 63b55343c764d933b5e32ff3b3865a5824128828..a06cf882cc3ca6271bc06b9e85dd8ec374bc9f13 100644 --- a/ds/map/slice_sorted/internal.ha +++ b/ds/map/slice_sorted/internal.ha @@ -1,5 +1,3 @@ -use sort; - fn cmp_kv(a: const *opaque, b: const *opaque) int = { let ka = (*(a: *([]u8, *opaque))).0; let kb = (*(b: *([]u8, *opaque))).0; @@ -16,7 +14,3 @@ if (len(a) < len(b)) return -1; if (len(a) > len(b)) return 1; return 0; }; - -fn resort(m: *map) void = { - sort::inplace((m.items: []opaque), size(([]u8, *opaque)), &cmp_kv); -}; diff --git a/ds/map/slice_sorted/set.ha b/ds/map/slice_sorted/set.ha index f38b3ae13a67094c1b76adf908fea236f1192718..34a74059105c4d77d4c7809ac84ab4d265090566 100644 --- a/ds/map/slice_sorted/set.ha +++ b/ds/map/slice_sorted/set.ha @@ -4,13 +4,16 @@ // Sets an item in a [[map]], replacing any existing item with the same key. export fn set(m: *map, key: []u8, value: *opaque) (void | nomem) = { let dummy = 0; let probe = (key, (&dummy: *opaque)); + match (sort::search((m.items: []const opaque), size(([]u8, *opaque)), (&probe: const *opaque), &cmp_kv)) { case let idx: size => m.items[idx].1 = value; case void => - append(m.items, (key, value))?; + let ins = sort::lbisect((m.items: []const opaque), + size(([]u8, *opaque)), + (&probe: const *opaque), &cmp_kv); + insert(m.items[ins], (key, value))?; }; - resort(m); }; -- 2.48.1