aboutsummaryrefslogtreecommitdiff
path: root/core/runtime
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-09-21 12:09:05 +0100
committergingerBill <bill@gingerbill.org>2022-09-21 12:09:05 +0100
commit1d793ea33810036d1c93f9cae666e91fa15ee22a (patch)
treebcbe0b6cbb1c3d2c9061806918e6c00ada9622d7 /core/runtime
parent5337413c5605655847767105f609d74a357984da (diff)
Split header table data and the map pointer
Diffstat (limited to 'core/runtime')
-rw-r--r--core/runtime/dynamic_map_internal.odin174
1 files changed, 90 insertions, 84 deletions
diff --git a/core/runtime/dynamic_map_internal.odin b/core/runtime/dynamic_map_internal.odin
index e63109f46..35c005071 100644
--- a/core/runtime/dynamic_map_internal.odin
+++ b/core/runtime/dynamic_map_internal.odin
@@ -38,8 +38,7 @@ Map_Entry_Header :: struct {
*/
}
-Map_Header :: struct {
- m: ^Raw_Map,
+Map_Header_Table :: struct {
equal: Equal_Proc,
entry_size: int,
@@ -52,6 +51,95 @@ Map_Header :: struct {
value_size: int,
}
+Map_Header :: struct {
+ m: ^Raw_Map,
+ using header_table: Map_Header_Table,
+}
+
+// USED INTERNALLY BY THE COMPILER
+__dynamic_map_get :: proc "contextless" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr) -> rawptr {
+ index := __dynamic_map_find(h, key_hash, key_ptr).entry_index
+ if index != MAP_SENTINEL {
+ data := uintptr(__dynamic_map_get_entry(h, index))
+ return rawptr(data + h.value_offset)
+ }
+ return nil
+}
+
+// USED INTERNALLY BY THE COMPILER
+__dynamic_map_set :: proc "odin" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr, value: rawptr, loc := #caller_location) -> ^Map_Entry_Header #no_bounds_check {
+ add_entry :: proc "odin" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr, loc := #caller_location) -> Map_Index {
+ prev := Map_Index(h.m.entries.len)
+ c := Map_Index(__dynamic_array_append_nothing(&h.m.entries, h.entry_size, h.entry_align, loc))
+ if c != prev {
+ end := __dynamic_map_get_entry(h, c-1)
+ end.hash = key_hash
+ mem_copy(rawptr(uintptr(end) + h.key_offset), key_ptr, h.key_size)
+ end.next = MAP_SENTINEL
+ }
+ return prev
+ }
+
+ index := MAP_SENTINEL
+
+ if len(h.m.hashes) == 0 {
+ __dynamic_map_reserve(h, INITIAL_MAP_CAP, loc)
+ __dynamic_map_grow(h, loc)
+ }
+
+ fr := __dynamic_map_find(h, key_hash, key_ptr)
+ if fr.entry_index != MAP_SENTINEL {
+ index = fr.entry_index
+ } else {
+ index = add_entry(h, key_hash, key_ptr, loc)
+ if fr.entry_prev != MAP_SENTINEL {
+ entry := __dynamic_map_get_entry(h, fr.entry_prev)
+ entry.next = index
+ } else if fr.hash_index != MAP_SENTINEL {
+ h.m.hashes[fr.hash_index] = index
+ } else {
+ return nil
+ }
+ }
+
+ e := __dynamic_map_get_entry(h, index)
+ e.hash = key_hash
+
+ key := rawptr(uintptr(e) + h.key_offset)
+ val := rawptr(uintptr(e) + h.value_offset)
+
+ mem_copy(key, key_ptr, h.key_size)
+ mem_copy(val, value, h.value_size)
+
+ if __dynamic_map_full(h) {
+ __dynamic_map_grow(h, loc)
+ }
+
+ return __dynamic_map_get_entry(h, index)
+}
+
+// USED INTERNALLY BY THE COMPILER
+__dynamic_map_reserve :: proc "odin" (h: Map_Header, cap: uint, loc := #caller_location) {
+ c := context
+ if h.m.entries.allocator.procedure != nil {
+ c.allocator = h.m.entries.allocator
+ }
+ context = c
+
+ cap := cap
+ cap = ceil_to_pow2(cap)
+
+ __dynamic_array_reserve(&h.m.entries, h.entry_size, h.entry_align, int(cap), loc)
+
+ if h.m.entries.len*2 < len(h.m.hashes) {
+ return
+ }
+ if __slice_resize(&h.m.hashes, int(cap*2), h.m.entries.allocator, loc) {
+ __dynamic_map_reset_entries(h, loc)
+ }
+}
+
+
INITIAL_HASH_SEED :: 0xcbf29ce484222325
_fnv64a :: proc "contextless" (data: []byte, seed: u64 = INITIAL_HASH_SEED) -> u64 {
@@ -221,26 +309,6 @@ __dynamic_map_reset_entries :: proc "contextless" (h: Map_Header, loc := #caller
}
}
-__dynamic_map_reserve :: proc "odin" (h: Map_Header, cap: uint, loc := #caller_location) {
- c := context
- if h.m.entries.allocator.procedure != nil {
- c.allocator = h.m.entries.allocator
- }
- context = c
-
- cap := cap
- cap = ceil_to_pow2(cap)
-
- __dynamic_array_reserve(&h.m.entries, h.entry_size, h.entry_align, int(cap), loc)
-
- if h.m.entries.len*2 < len(h.m.hashes) {
- return
- }
- if __slice_resize(&h.m.hashes, int(cap*2), h.m.entries.allocator, loc) {
- __dynamic_map_reset_entries(h, loc)
- }
-}
-
__dynamic_map_shrink :: proc "odin" (h: Map_Header, cap: int, loc := #caller_location) -> (did_shrink: bool) {
c := context
if h.m.entries.allocator.procedure != nil {
@@ -251,68 +319,6 @@ __dynamic_map_shrink :: proc "odin" (h: Map_Header, cap: int, loc := #caller_loc
return __dynamic_array_shrink(&h.m.entries, h.entry_size, h.entry_align, cap, loc)
}
-// USED INTERNALLY BY THE COMPILER
-__dynamic_map_get :: proc "contextless" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr) -> rawptr {
- index := __dynamic_map_find(h, key_hash, key_ptr).entry_index
- if index != MAP_SENTINEL {
- data := uintptr(__dynamic_map_get_entry(h, index))
- return rawptr(data + h.value_offset)
- }
- return nil
-}
-
-// USED INTERNALLY BY THE COMPILER
-__dynamic_map_set :: proc "odin" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr, value: rawptr, loc := #caller_location) -> ^Map_Entry_Header #no_bounds_check {
- add_entry :: proc "odin" (h: Map_Header, key_hash: uintptr, key_ptr: rawptr, loc := #caller_location) -> Map_Index {
- prev := Map_Index(h.m.entries.len)
- c := Map_Index(__dynamic_array_append_nothing(&h.m.entries, h.entry_size, h.entry_align, loc))
- if c != prev {
- end := __dynamic_map_get_entry(h, c-1)
- end.hash = key_hash
- mem_copy(rawptr(uintptr(end) + h.key_offset), key_ptr, h.key_size)
- end.next = MAP_SENTINEL
- }
- return prev
- }
-
- index := MAP_SENTINEL
-
- if len(h.m.hashes) == 0 {
- __dynamic_map_reserve(h, INITIAL_MAP_CAP, loc)
- __dynamic_map_grow(h, loc)
- }
-
- fr := __dynamic_map_find(h, key_hash, key_ptr)
- if fr.entry_index != MAP_SENTINEL {
- index = fr.entry_index
- } else {
- index = add_entry(h, key_hash, key_ptr, loc)
- if fr.entry_prev != MAP_SENTINEL {
- entry := __dynamic_map_get_entry(h, fr.entry_prev)
- entry.next = index
- } else if fr.hash_index != MAP_SENTINEL {
- h.m.hashes[fr.hash_index] = index
- } else {
- return nil
- }
- }
-
- e := __dynamic_map_get_entry(h, index)
- e.hash = key_hash
-
- key := rawptr(uintptr(e) + h.key_offset)
- val := rawptr(uintptr(e) + h.value_offset)
-
- mem_copy(key, key_ptr, h.key_size)
- mem_copy(val, value, h.value_size)
-
- if __dynamic_map_full(h) {
- __dynamic_map_grow(h, loc)
- }
-
- return __dynamic_map_get_entry(h, index)
-}
-
@(private="file")
ceil_to_pow2 :: proc "contextless" (n: uint) -> uint {