aboutsummaryrefslogtreecommitdiff
path: root/lib/libcxx/src/random.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-01-31 01:10:50 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-01-31 01:20:45 -0700
commitcf88cf2657d721c68055a284e8c498a18639f74c (patch)
treedc033a7f498a892bc7756cee8d4a46bbb56340c6 /lib/libcxx/src/random.cpp
parent91ad96b88a88016043cb0d069aa9db47747170b6 (diff)
downloadzig-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/random.cpp')
0 files changed, 0 insertions, 0 deletions