Fix map assignment bug due to growth

This commit is contained in:
Ginger Bill
2017-04-11 21:13:21 +01:00
parent 5916e71d4f
commit f5819eafa9
5 changed files with 78 additions and 26 deletions

View File

@@ -284,6 +284,9 @@ __string_eq :: proc(a, b: string) -> bool {
if len(a) != len(b) {
return false;
}
if len(a) == 0 {
return true;
}
if ^a[0] == ^b[0] {
return true;
}
@@ -570,10 +573,9 @@ __Map_Header :: struct #ordered {
value_offset: int,
}
__dynamic_map_reserve :: proc(using header: __Map_Header, cap: int) -> bool {
h := __dynamic_array_reserve(^m.hashes, size_of(int), align_of(int), cap);
e := __dynamic_array_reserve(^m.entries, entry_size, entry_align, cap);
return h && e;
__dynamic_map_reserve :: proc(using header: __Map_Header, cap: int) {
__dynamic_array_reserve(^m.hashes, size_of(int), align_of(int), cap);
__dynamic_array_reserve(^m.entries, entry_size, entry_align, cap);
}
__dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
@@ -587,7 +589,7 @@ __dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
reserve(nm.hashes, new_count);
nm_hashes.len = nm_hashes.cap;
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.cap);
for _, i in nm.hashes {
nm.hashes[i] = -1;
}
@@ -634,6 +636,8 @@ __dynamic_map_get :: proc(h: __Map_Header, key: __Map_Key) -> rawptr {
__dynamic_map_set :: proc(using h: __Map_Header, key: __Map_Key, value: rawptr) {
index: int;
assert(value != nil);
if len(m.hashes) == 0 {
__dynamic_map_grow(h);
@@ -659,11 +663,12 @@ __dynamic_map_set :: proc(using h: __Map_Header, key: __Map_Key, value: rawptr)
if __dynamic_map_full(h) {
__dynamic_map_grow(h);
}
fmt.println("entries:", h.m.entries.len);
}
__dynamic_map_grow :: proc(using h: __Map_Header) {
new_count := 2*m.entries.len + 8;
new_count := max(2*m.entries.cap + 8, 8);
__dynamic_map_rehash(h, new_count);
}

View File

@@ -31,12 +31,16 @@ TexImage2D :: proc(target, level, internal_format,
format, type: i32, pixels: rawptr) #foreign lib "glTexImage2D";
string_data :: proc(s: string) -> ^u8 #inline { return ^s[0]; }
_string_data :: proc(s: string) -> ^u8 #inline { return ^s[0]; }
_libgl := win32.LoadLibraryA(string_data("opengl32.dll\x00"));
_libgl := win32.LoadLibraryA(_string_data("opengl32.dll\x00"));
GetProcAddress :: proc(name: string) -> proc() #cc_c {
assert(name[len(name)-1] == 0);
if name[len(name)-1] == 0 {
name = name[..len(name)-1];
}
// NOTE(bill): null terminated
assert((^name[0] + len(name))^ == 0);
res := wgl.GetProcAddress(^name[0]);
if res == nil {
res = win32.GetProcAddress(_libgl, ^name[0]);