mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Fix: map key not getting transferred on rehash
This commit is contained in:
+3
-4
@@ -592,14 +592,13 @@ __dynamic_map_reserve :: proc(using header: __Map_Header, cap: int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
__dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
||||||
new_header := header;
|
new_header: __Map_Header = header;
|
||||||
nm: raw.Dynamic_Map;
|
nm: raw.Dynamic_Map;
|
||||||
new_header.m = ^nm;
|
new_header.m = ^nm;
|
||||||
|
|
||||||
header_hashes := cast(^raw.Dynamic_Array)^header.m.hashes;
|
header_hashes := cast(^raw.Dynamic_Array)^header.m.hashes;
|
||||||
nm_hashes := cast(^raw.Dynamic_Array)^nm.hashes;
|
nm_hashes := cast(^raw.Dynamic_Array)^nm.hashes;
|
||||||
|
|
||||||
|
|
||||||
__dynamic_array_resize(nm_hashes, size_of(int), align_of(int), new_count);
|
__dynamic_array_resize(nm_hashes, size_of(int), align_of(int), new_count);
|
||||||
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
|
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
|
||||||
for i in 0..new_count {
|
for i in 0..new_count {
|
||||||
@@ -611,7 +610,7 @@ __dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
|||||||
__dynamic_map_grow(new_header);
|
__dynamic_map_grow(new_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry_header := __dynamic_map_get_entry(new_header, i);
|
entry_header := __dynamic_map_get_entry(header, i);
|
||||||
data := cast(^byte)entry_header;
|
data := cast(^byte)entry_header;
|
||||||
|
|
||||||
fr := __dynamic_map_find(new_header, entry_header.key);
|
fr := __dynamic_map_find(new_header, entry_header.key);
|
||||||
@@ -626,7 +625,7 @@ __dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
|||||||
e := __dynamic_map_get_entry(new_header, j);
|
e := __dynamic_map_get_entry(new_header, j);
|
||||||
e.next = fr.entry_index;
|
e.next = fr.entry_index;
|
||||||
ndata := cast(^byte)e;
|
ndata := cast(^byte)e;
|
||||||
__mem_copy(ndata+value_offset, data+value_offset, entry_size-value_offset);
|
__mem_copy(ndata+value_offset, data+value_offset, value_size);
|
||||||
|
|
||||||
if __dynamic_map_full(new_header) {
|
if __dynamic_map_full(new_header) {
|
||||||
__dynamic_map_grow(new_header);
|
__dynamic_map_grow(new_header);
|
||||||
|
|||||||
+1
-4
@@ -3622,14 +3622,11 @@ b32 gb_is_power_of_two(isize x) {
|
|||||||
|
|
||||||
gb_inline void *gb_align_forward(void *ptr, isize alignment) {
|
gb_inline void *gb_align_forward(void *ptr, isize alignment) {
|
||||||
uintptr p;
|
uintptr p;
|
||||||
isize modulo;
|
|
||||||
|
|
||||||
GB_ASSERT(gb_is_power_of_two(alignment));
|
GB_ASSERT(gb_is_power_of_two(alignment));
|
||||||
|
|
||||||
p = cast(uintptr)ptr;
|
p = cast(uintptr)ptr;
|
||||||
modulo = p & (alignment-1);
|
return cast(void *)((p + (alignment-1)) &~ (alignment-1));
|
||||||
if (modulo) p += (alignment - modulo);
|
|
||||||
return cast(void *)p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user