diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-01-31 01:10:50 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-01-31 01:20:45 -0700 |
| commit | cf88cf2657d721c68055a284e8c498a18639f74c (patch) | |
| tree | dc033a7f498a892bc7756cee8d4a46bbb56340c6 /lib/libcxx/src/optional.cpp | |
| parent | 91ad96b88a88016043cb0d069aa9db47747170b6 (diff) | |
| download | zig-cf88cf2657d721c68055a284e8c498a18639f74c.tar.gz zig-cf88cf2657d721c68055a284e8c498a18639f74c.zip | |
std: make ArrayHashMap eql function accept an additional param
which is the index of the key that already exists in the hash map.
This enables the use case of using `AutoArrayHashMap(void, void)` which
may seem surprising at first, but is actually pretty handy!
This commit includes a proof-of-concept of how I want to use it, with a
new InternArena abstraction for stage2 that provides a compact way to
store values (and types) in an "internment arena", thus making types
stored exactly once (per arena), representable with a single u32 as a
reference to a type within an InternArena, and comparable with a
simple u32 integer comparison. If both types are in the same
InternArena, you can check if they are equal by seeing if their index is
the same.
What's neat about `AutoArrayHashMap(void, void)` is that it allows us to
look up the indexes by key, *without actually storing the keys*.
Instead, keys are treated as ephemeral values that are constructed as
needed.
As a result, we have an extremely efficient encoding of types and
values, represented only by three arrays, which has no pointers, and can
therefore be serialized and deserialized by a single writev/readv call.
The `map` field is denormalized data and can be computed from the other
two fields.
This is in contrast to our current Type/Value system which makes
extensive use of pointers.
The test at the bottom of InternArena.zig passes in this commit.
Diffstat (limited to 'lib/libcxx/src/optional.cpp')
0 files changed, 0 insertions, 0 deletions
