From 50188f03086da716a8f23926ae10be6fd87abab4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 1 Jan 2022 17:13:11 +0000 Subject: [PATCH] Add `sort.map_entries_by_key` `sort.map_entries_by_value` --- core/sort/map.odin | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 core/sort/map.odin diff --git a/core/sort/map.odin b/core/sort/map.odin new file mode 100644 index 000000000..dff2dced3 --- /dev/null +++ b/core/sort/map.odin @@ -0,0 +1,33 @@ +package sort + +import "core:intrinsics" +import "core:runtime" +import "core:slice" + +map_entries_by_key :: proc(m: ^$M/map[$K]$V, loc := #caller_location) where intrinsics.type_is_ordered(K) { + Entry :: struct { + hash: uintptr, + next: int, + key: K, + value: V, + } + + header := runtime.__get_map_header(m) + entries := (^[dynamic]Entry)(&header.m.entries) + slice.sort_by_key(entries[:], proc(e: Entry) -> K { return e.key }) + runtime.__dynamic_map_reset_entries(header, loc) +} + +map_entries_by_value :: proc(m: ^$M/map[$K]$V, loc := #caller_location) where intrinsics.type_is_ordered(V) { + Entry :: struct { + hash: uintptr, + next: int, + key: K, + value: V, + } + + header := runtime.__get_map_header(m) + entries := (^[dynamic]Entry)(&header.m.entries) + slice.sort_by_key(entries[:], proc(e: Entry) -> V { return e.value }) + runtime.__dynamic_map_reset_entries(header, loc) +} \ No newline at end of file