Browse Source

Get deleted key and value for `delete_key`

gingerBill 2 years ago
parent
commit
b475481788
2 changed files with 15 additions and 5 deletions
  1. 5 2
      core/runtime/core_builtin.odin
  2. 10 3
      core/runtime/dynamic_map_internal.odin

+ 5 - 2
core/runtime/core_builtin.odin

@@ -300,8 +300,11 @@ shrink_map :: proc(m: ^$T/map[$K]$V, loc := #caller_location) -> (did_shrink: bo
 delete_key :: proc(m: ^$T/map[$K]$V, key: K) -> (deleted_key: K, deleted_value: V) {
 	if m != nil {
 		key := key
-		_ =  map_erase_dynamic((^Raw_Map)(m), map_info(T), uintptr(&key))
-		// TODO(bill) old key and value
+		old_k, old_v, ok :=  map_erase_dynamic((^Raw_Map)(m), map_info(T), uintptr(&key))
+		if ok {
+			deleted_key   = (^K)(old_k)^
+			deleted_value = (^V)(old_v)^
+		}
 	}
 	return
 }

+ 10 - 3
core/runtime/dynamic_map_internal.odin

@@ -594,14 +594,18 @@ map_exists_dynamic :: proc "contextless" (m: Raw_Map, #no_alias info: ^Map_Info,
 
 
 
-map_erase_dynamic :: #force_inline proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, k: uintptr) -> bool {
+@(require_results)
+map_erase_dynamic :: #force_inline proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, k: uintptr) -> (old_k, old_v: uintptr, ok: bool) {
 	MASK :: 1 << (size_of(Map_Hash)*8 - 1)
 
 	index := map_lookup_dynamic(m^, info, k) or_return
-	_, _, hs, _, _ := map_kvh_data_dynamic(m^, info)
+	ks, vs, hs, _, _ := map_kvh_data_dynamic(m^, info)
 	hs[index] |= MASK
+	old_k = map_cell_index_dynamic(ks, info.ks, index)
+	old_v = map_cell_index_dynamic(vs, info.vs, index)
 	m.len -= 1
-	return true
+	ok = true
+	return
 }
 
 map_clear_dynamic :: #force_inline proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info) {
@@ -681,6 +685,7 @@ __dynamic_map_get_with_hash :: proc "contextless" (#no_alias m: ^Raw_Map, #no_al
 	}
 }
 
+// IMPORTANT: USED WITHIN THE COMPILER
 __dynamic_map_get :: proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key: rawptr) -> (ptr: rawptr) {
 	if m.len == 0 {
 		return nil
@@ -689,6 +694,7 @@ __dynamic_map_get :: proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info:
 	return __dynamic_map_get_with_hash(m, info, h, key)
 }
 
+// IMPORTANT: USED WITHIN THE COMPILER
 __dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key, value: rawptr, loc := #caller_location) -> rawptr {
 	hash := info.key_hasher(key, 0)
 
@@ -709,6 +715,7 @@ __dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_In
 	return rawptr(result)
 }
 
+// IMPORTANT: USED WITHIN THE COMPILER
 @(private)
 __dynamic_map_reserve :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, new_capacity: uint, loc := #caller_location) {
 	map_reserve_dynamic(m, info, uintptr(new_capacity), loc)