mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
Get deleted key and value for delete_key
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user