aboutsummaryrefslogtreecommitdiff
path: root/hashmap.ha
diff options
context:
space:
mode:
Diffstat (limited to 'hashmap.ha')
-rw-r--r--hashmap.ha25
1 files changed, 19 insertions, 6 deletions
diff --git a/hashmap.ha b/hashmap.ha
index dd580b0..41235ea 100644
--- a/hashmap.ha
+++ b/hashmap.ha
@@ -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]);
};