File 0634-erts-Add-erts_usort_flatmap-for-usage-by-pam.patch of Package erlang

From a4185325e4ce1dfa9c1c5b3bb720b04266d683e8 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Thu, 12 Aug 2021 16:34:06 +0200
Subject: [PATCH 4/6] erts: Add erts_usort_flatmap for usage by pam

---
 erts/emulator/beam/erl_map.c | 38 ++++++++++++++++++++++++++++++++++++
 erts/emulator/beam/erl_map.h |  1 +
 2 files changed, 39 insertions(+)

diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c
index d0d455e2d0..395c4d9ca9 100644
--- a/erts/emulator/beam/erl_map.c
+++ b/erts/emulator/beam/erl_map.c
@@ -3018,6 +3018,44 @@ int erts_validate_and_sort_flatmap(flatmap_t* mp)
     return 1;
 }
 
+void erts_usort_flatmap(flatmap_t* mp)
+{
+    Eterm *ks  = flatmap_get_keys(mp);
+    Eterm *vs  = flatmap_get_values(mp);
+    Uint   sz  = flatmap_get_size(mp);
+    Uint   ix,jx;
+    Eterm  tmp;
+    Sint c;
+
+    /* sort and shrink */
+
+    for (ix = 1; ix < sz; ix++) {
+	jx = ix;
+	while( jx > 0 && (c = CMP_TERM(ks[jx],ks[jx-1])) <= 0 ) {
+	    /* identical key -> remove it */
+	    if (c == 0) {
+                sys_memmove(ks+jx-1,ks+jx,(sz-ix)*sizeof(Eterm));
+                sys_memmove(vs+jx-1,vs+jx,(sz-ix)*sizeof(Eterm));
+                sz--;
+                ix--;
+                break;
+            }
+
+	    tmp = ks[jx];
+	    ks[jx] = ks[jx - 1];
+	    ks[jx - 1] = tmp;
+
+	    tmp = vs[jx];
+	    vs[jx] = vs[jx - 1];
+	    vs[jx - 1] = tmp;
+
+	    jx--;
+	}
+    }
+    mp->size = sz;
+    *tuple_val(mp->keys) = make_arityval(sz);
+}
+
 #if 0 /* Can't get myself to remove this beautiful piece of code
          for probabilistic overestimation of nr of nodes in a hashmap */
 
diff --git a/erts/emulator/beam/erl_map.h b/erts/emulator/beam/erl_map.h
index 980cf246c4..c54a516af0 100644
--- a/erts/emulator/beam/erl_map.h
+++ b/erts/emulator/beam/erl_map.h
@@ -91,6 +91,7 @@ Eterm  erts_hashmap_insert_up(Eterm *hp, Eterm key, Eterm value,
 			      Uint *upsz, struct ErtsEStack_ *sp);
 
 int    erts_validate_and_sort_flatmap(flatmap_t* map);
+void   erts_usort_flatmap(flatmap_t* map);
 void   hashmap_iterator_init(struct ErtsWStack_* s, Eterm node, int reverse);
 Eterm* hashmap_iterator_next(struct ErtsWStack_* s);
 Eterm* hashmap_iterator_prev(struct ErtsWStack_* s);
-- 
2.31.1

openSUSE Build Service is sponsored by