From b47548178811860afaffbba0690c644823b72d5e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 11 Nov 2022 11:19:34 +0000 Subject: [PATCH] Get deleted key and value for `delete_key` --- core/runtime/core_builtin.odin | 7 +++++-- core/runtime/dynamic_map_internal.odin | 13 ++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/runtime/core_builtin.odin b/core/runtime/core_builtin.odin index c04d79455..754316dab 100644 --- a/core/runtime/core_builtin.odin +++ b/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 } diff --git a/core/runtime/dynamic_map_internal.odin b/core/runtime/dynamic_map_internal.odin index aedd3f260..303f566ed 100644 --- a/core/runtime/dynamic_map_internal.odin +++ b/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)