2023-04-18 05:35:31 +00:00
|
|
|
# Hash Array Mapped Trie
|
|
|
|
|
|
|
|
A barebones implementation of [this paper](https://infoscience.epfl.ch/record/64398) by Phil Bagwell.
|
|
|
|
|
|
|
|
### Usage
|
|
|
|
|
|
|
|
As an example:
|
|
|
|
```zig
|
|
|
|
const std = @import("std");
|
|
|
|
const expectEqual = std.testing.expectEqual;
|
|
|
|
const HashArrayMappedTrie = @import("hamt").HashArrayMappedTrie;
|
|
|
|
|
|
|
|
const StringTrie = HashArrayMappedTrie([]const u8, void, StringContext);
|
|
|
|
|
|
|
|
const StringContext = struct {
|
|
|
|
// Note: This definition is *required*
|
|
|
|
// TODO: I could just grab the @typeInfo(HashFn).Fn.return_type right?
|
|
|
|
pub const Digest = u64;
|
|
|
|
|
|
|
|
pub inline fn hash(key: []const u8) Digest {
|
|
|
|
return std.hash.Wyhash.hash(0, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub inline fn eql(left: []const u8, right: []const u8) bool {
|
|
|
|
return std.mem.eql(u8, left, right);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
test {
|
|
|
|
const Pair = StringTrie.Pair;
|
|
|
|
const allocator = std.testing.allocator;
|
|
|
|
|
2023-04-20 21:12:36 +00:00
|
|
|
var trie = try StringTrie.init(allocator);
|
2023-04-18 05:35:31 +00:00
|
|
|
defer trie.deinit(allocator);
|
|
|
|
|
|
|
|
try trie.insert(allocator, "hello", {});
|
|
|
|
|
|
|
|
try expectEqual(@as(?Pair, .{ .key = "hello", .value = {} }), trie.search("hello"));
|
|
|
|
try expectEqual(@as(?Pair, null), trie.search("world"));
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### Building
|
|
|
|
|
|
|
|
Build in release mode with `zig build -Doptimzie=ReleaseSafe`;
|
|
|
|
|