Преглед изворни кода

Add `sort.map_entries_by_key` `sort.map_entries_by_value`

gingerBill пре 3 година
родитељ
комит
50188f0308
1 измењених фајлова са 33 додато и 0 уклоњено
  1. 33 0
      core/sort/map.odin

+ 33 - 0
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)
+}