Andrew Kelley cf88cf2657 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.
2022-01-31 01:20:45 -07:00
..
2022-01-24 17:29:19 +02:00
2022-01-28 16:23:47 -07:00
2022-01-29 20:30:53 +00:00
2022-01-27 19:35:08 +02:00
2022-01-24 20:15:32 +02:00
2022-01-17 16:56:50 +02:00
2022-01-27 19:42:40 +02:00
2022-01-07 00:06:06 -05:00
2022-01-17 12:32:02 +01:00
2022-01-28 11:45:04 -07:00
2022-01-20 10:54:45 +02:00
2022-01-30 21:27:52 +02:00
2021-10-27 16:07:48 -04:00
2022-01-07 00:06:06 -05:00
2022-01-30 21:27:52 +02:00
2022-01-07 00:06:06 -05:00