diff options
Diffstat (limited to 'hashmap.ha')
| -rw-r--r-- | hashmap.ha | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -1,15 +1,28 @@ -use hash::fnv; - def BUCKETS: size = 1 << 17; -type hashmap = [BUCKETS](str, data); +type hashmap = [BUCKETS][](size, data); fn getitem(map: *hashmap, hash: size) data = { let bucket = &map[hash & (BUCKETS - 1)]; - return bucket.1; + for (let i = 0z; i < len(bucket); i += 1) { + if (bucket[i].0 == hash) + return bucket[i].1; + }; + return data { ... }; }; -fn setitem(map: *hashmap, hash: size, key: str, value: data) void = { +fn setitem(map: *hashmap, hash: size, value: data) void = { let bucket = &map[hash & (BUCKETS - 1)]; - *bucket = (key, value); + for (let i = 0z; i < len(bucket); i += 1) { + if (bucket[i].0 == hash) { + bucket[i].1 = value; + return; + }; + }; + append(bucket, (hash, value))!; +}; + +fn finish(map: *hashmap) void = { + for (let i = 0z; i < len(map); i += 1) + free(map[i]); }; |
