Get deleted key and value for delete_key

This commit is contained in:
gingerBill
2022-11-11 11:19:34 +00:00
parent 033525fe13
commit b475481788
2 changed files with 15 additions and 5 deletions
+5 -2
View File
@@ -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) { delete_key :: proc(m: ^$T/map[$K]$V, key: K) -> (deleted_key: K, deleted_value: V) {
if m != nil { if m != nil {
key := key key := key
_ = map_erase_dynamic((^Raw_Map)(m), map_info(T), uintptr(&key)) old_k, old_v, ok := map_erase_dynamic((^Raw_Map)(m), map_info(T), uintptr(&key))
// TODO(bill) old key and value if ok {
deleted_key = (^K)(old_k)^
deleted_value = (^V)(old_v)^
}
} }
return return
} }
+10 -3
View File
@@ -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) MASK :: 1 << (size_of(Map_Hash)*8 - 1)
index := map_lookup_dynamic(m^, info, k) or_return 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 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 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) { 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) { __dynamic_map_get :: proc "contextless" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key: rawptr) -> (ptr: rawptr) {
if m.len == 0 { if m.len == 0 {
return nil 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) 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 { __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) 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) return rawptr(result)
} }
// IMPORTANT: USED WITHIN THE COMPILER
@(private) @(private)
__dynamic_map_reserve :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, new_capacity: uint, loc := #caller_location) { __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) map_reserve_dynamic(m, info, uintptr(new_capacity), loc)