diff options
| author | gingerBill <bill@gingerbill.org> | 2022-11-08 21:21:19 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-11-08 21:21:19 +0000 |
| commit | bcf437dc11507611a3850a2d5964c6e893403967 (patch) | |
| tree | ae87ec592d8ea9becb16609720f585d3b839f069 /core | |
| parent | 503eb470a74028052e12630fdb72aa6fa380eff4 (diff) | |
Check for existence before setting
Test code
Diffstat (limited to 'core')
| -rw-r--r-- | core/runtime/dynamic_map_internal.odin | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/core/runtime/dynamic_map_internal.odin b/core/runtime/dynamic_map_internal.odin index df3d09375..7d7b5283c 100644 --- a/core/runtime/dynamic_map_internal.odin +++ b/core/runtime/dynamic_map_internal.odin @@ -360,21 +360,6 @@ map_insert_hash_dynamic :: proc "odin" (m: Raw_Map, #no_alias info: ^Map_Info, h ks, vs, hs, sk, sv := map_kvh_data_dynamic(m, info) - get_loop: for { - element_hash := hs[pos] - if map_hash_is_empty(element_hash) { - break get_loop - } else if distance > map_probe_distance(m, element_hash, pos) { - break get_loop - } else if element_hash == h && info.key_equal(rawptr(ik), rawptr(map_cell_index_dynamic(ks, info.ks, pos))) { - result = map_cell_index_dynamic(vs, info.vs, pos) - intrinsics.mem_copy_non_overlapping(rawptr(result), rawptr(iv), info.ks.size_of_type) - return - } - pos = (pos + 1) & mask - distance += 1 - } - // Avoid redundant loads of these values size_of_k := info.ks.size_of_type size_of_v := info.vs.size_of_type @@ -416,10 +401,6 @@ map_insert_hash_dynamic :: proc "odin" (m: Raw_Map, #no_alias info: ^Map_Info, h intrinsics.mem_copy_non_overlapping(rawptr(v_dst), rawptr(v), size_of_v) hp^ = h return result if result != 0 else v_dst - } else if element_hash == h && info.key_equal(rawptr(k), rawptr(map_cell_index_dynamic(ks, info.ks, pos))) { - v_dst := map_cell_index_dynamic(vs, info.vs, pos) - intrinsics.mem_copy_non_overlapping(rawptr(v_dst), rawptr(iv), info.vs.size_of_type) - return v_dst } if result == 0 { @@ -662,7 +643,13 @@ map_exists_dynamic :: proc "contextless" (m: Raw_Map, #no_alias info: ^Map_Info, @(optimization_mode="speed") -map_insert_dynamic :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, k, v: uintptr, loc := #caller_location) -> (value: uintptr, err: Allocator_Error) { +map_set_dynamic :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, k, v: uintptr, loc := #caller_location) -> (value: uintptr, err: Allocator_Error) { + if found := __dynamic_map_get(m^, info, rawptr(k)); found != nil { + intrinsics.mem_copy_non_overlapping(found, rawptr(v), info.vs.size_of_type) + value = uintptr(found) + return + } + if map_len(m^) + 1 >= map_resize_threshold(m^) { map_grow_dynamic(m, info, loc) or_return } @@ -762,7 +749,7 @@ __dynamic_map_get :: proc "contextless" (m: Raw_Map, #no_alias info: ^Map_Info, } __dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key, value: rawptr, loc := #caller_location) -> rawptr { - value, err := map_insert_dynamic(m, info, uintptr(key), uintptr(value), loc) + value, err := map_set_dynamic(m, info, uintptr(key), uintptr(value), loc) return rawptr(value) if err == nil else nil } |