aboutsummaryrefslogtreecommitdiff
path: root/hashmap.ha
blob: 41235ea9bb4df959d1d499a6e71c8c826d0f1d4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def BUCKETS: size = 1 << 17;

type hashmap = [BUCKETS][](size, data);

fn getitem(map: *hashmap, hash: size) data = {
	let bucket = &map[hash & (BUCKETS - 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, value: data) void = {
	let bucket = &map[hash & (BUCKETS - 1)];
	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]);
};