aboutsummaryrefslogtreecommitdiff
path: root/lib/std/hash_map.zig
AgeCommit message (Collapse)Author
2022-04-20std: fix missing hash map safetyAndrew Kelley
There was a missing compile error for calling ensureUnusedCapacity without a Context in the case that the Context is non-void.
2022-04-01std.hash_map: workaround for circular dependencyAndrew Kelley
See #11367 It's debatable whether this ends up being a legitimate compile error or whether the lang spec allows this test case. For now this workaround seems very reasonable; delaying comptime execution of `verifyContext` until the struct is instantiated.
2022-03-16gdb: add slice, multi array list, and array hash map printersRobin Voetter
2022-02-28make gpa.deinit work with stage2Veikka Tuominen
2022-02-27std.HashMap: return explicit errors (#11000)Motiejus Jakštys
All errors from std.HashMap are allocation errors. Mark them as such. This is helpful when one wants to return explicit errors where HashMap is used.
2022-02-18Fix incorrect documentation for std.HashMap.remove()chip2n
2022-01-31std: make ArrayHashMap eql function accept an additional paramAndrew Kelley
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-24HashMap: add removeByPtrriverbl
2022-01-10std: hash_map: optimize isFree/isTombstone (#10562)djg
- Add an `Metadata.isFree` helper method. - Implement `Metadata.isTombstone` and `Metadata.isFree` with `@bitCast` then comparing to a constant. I assume `@bitCast`-then-compare is faster than the old method because it only involves one comparison, and doesn't require bitmasking. - Summary of benchmarked changes (`gotta-go-fast`, run locally, compared to master): - 3/4 of the hash map benchmarks used ~10% fewer cycles - The last one (project Euler) shows 4% fewer cycles.
2021-12-17Revert "std: optimize hash_map probe loop condition"Andrew Kelley
This reverts commit 11803a3a569205d640c7ec0b0aedba83f47a6e64. Observations from the performance dashboard: * strictly worse in terms of CPU instructions * slightly worse wall time (but this can be noisy) * sometimes better, sometimes worse for branch predictions Given that the commit was introducing complexity for optimization's sake, these performance changes do not seem worth it.
2021-12-17std: optimize hash_map probe loop conditionsentientwaffle
See https://github.com/ziglang/zig/pull/10337 for context. In #10337 the `available` tracking fix necessitated an additional condition on the probe loop in both `getOrPut` and `getIndex` to prevent an infinite loop. Previously, this condition was implicit thanks to the guaranteed presence of a free slot. The new condition hurts the `HashMap` benchmarks (https://github.com/ziglang/zig/pull/10337#issuecomment-996432758). This commit removes that extra condition on the loop. Instead, when probing, first check whether the "home" slot is the target key — if so, return it. Otherwise, save the home slot's metadata to the stack and temporarily "free" the slot (but don't touch its value). Then continue with the original loop. Once again, the loop will be implicitly broken by the new "free" slot. The original metadata is restored before the function returns. `getOrPut` has one additional gotcha — if the home slot is a tombstone and `getOrPut` misses, then the home slot is is written with the new key; that is, its original metadata (the tombstone) is not restored. Other changes: - Test hash map misses. - Test using `getOrPutAssumeCapacity` to get keys at the end (along with `get`).
2021-12-16std: count hash_map tombstones as availablesentientwaffle
When entries are inserted and removed into a hash map at an equivalent rate (maintaining a mostly-consistent total count of entries), it should never need to be resized. But `HashMapUnmanaged.available` does not presently count tombstoned slots as "available", so this put/remove pattern eventually panics (assertion failure) when `available` reaches `0`. The solution implemented here is to count tombstoned slots as "available". Another approach (which hashbrown (https://github.com/rust-lang/hashbrown/blob/b3eaf32e608d1ec4c10963a4f495503d7f8a7ef5/src/raw/mod.rs#L1455-L1542) takes) would be to rehash all entries in place when there are too many tombstones. This is more complex but avoids an `O(n)` bad case when the hash map is full of many tombstones.
2021-11-30allocgate: std Allocator interface refactorLee Cannon
2021-11-30std lib API deprecations for the upcoming 0.9.0 releaseAndrew Kelley
See #3811
2021-10-27std.rand: Refactor `Random` interfaceOminitay
These changes have been made to resolve issue #10037. The `Random` interface was implemented in such a way that causes significant slowdown when calling the `fill` function of the rng used. The `Random` interface is no longer stored in a field of the rng, and is instead returned by the child function `random()` of the rng. This avoids the performance issues caused by the interface.
2021-09-19Update all ensureCapacity calls to the relevant non-deprecated versionRyan Liptak
2021-09-03std.hash_map: add StringIndexAdapter and StringIndexContextFnControlOption
2021-09-01std: reorganization that allows new usingnamespace semanticsAndrew Kelley
The proposal #9629 is now accepted, usingnamespace stays but no longer puts identifiers in scope.
2021-08-31std.hash_map: add getKey methods (#9607)fn ⌃ ⌥
2021-08-24remove redundant license headers from zig standard libraryAndrew Kelley
We already have a LICENSE file that covers the Zig Standard Library. We no longer need to remind everyone that the license is MIT in every single file. Previously this was introduced to clarify the situation for a fork of Zig that made Zig's LICENSE file harder to find, and replaced it with their own license that required annual payments to their company. However that fork now appears to be dead. So there is no need to reinforce the copyright notice in every single file.
2021-08-05std.HashMap: fix getPtrAdapted. AstGen: fix fn param iterationAndrew Kelley
There was a bug in stage2 regarding iteration of function parameter AST. This resulted in a false negative "unused parameter" compile error, which, when fixed, revealed a bug in the std lib HashMap implementation.
2021-07-12std/hash_map: fix ensureUnusedCapacity() over-allocatingIsaac Freund
Currently this function adds the desired unused capactiy to the current total capacity instead of the current used capactiy.
2021-07-07std.HashMap: add ensureUnusedCapacity and ensureTotalCapacityAndrew Kelley
and deprecated ensureCapacity. This matches the pattern set by ArrayList and ArrayHashMap already.
2021-06-21fix code broken from previous commitJacob G-W
2021-06-21std, src, doc, test: remove unused variablesJacob G-W
2021-06-18HashMap.getOrPutAssumeCapacityAdapted should set key to undefined (#9138)hadroncfy
* std.hash_map.HashMap: getOrPutAssumeCapacityAdapted should set key to undefined * add test for std.hash_map.HashMap.getOrPutAdapted
2021-06-10zig fmtAndrew Kelley
2021-06-03Fix return type of HashMap.getAdaptedMartin Wickham
2021-06-03Breaking hash map changes for 0.8.0Martin Wickham
- hash/eql functions moved into a Context object - *Context functions pass an explicit context - *Adapted functions pass specialized keys and contexts - new getPtr() function returns a pointer to value - remove functions renamed to fetchRemove - new remove functions return bool - removeAssertDiscard deleted, use assert(remove(...)) instead - Keys and values are stored in separate arrays - Entry is now {*K, *V}, the new KV is {K, V} - BufSet/BufMap functions renamed to match other set/map types - fixed iterating-while-modifying bug in src/link/C.zig
2021-05-15Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
Conflicts: * build.zig * src/Compilation.zig * src/codegen/spirv/spec.zig * src/link/SpirV.zig * test/stage2/darwin.zig - this one might be problematic; start.zig looks for `main` in the root source file, not `_main`. Not sure why there is an underscore there in master branch.
2021-05-14std.hash_map: use 7 bits of metadata instead of 6Sahnvour
we only effectively need 1 control bit to represent 2 special states for the metadata (free and tombstone) this should reduce the number of actual element equality tests, but since it's very low already, the impact is negligible
2021-05-08Merge remote-tracking branch 'origin/master' into stage2-whole-file-astgenAndrew Kelley
Conflicts: * doc/langref.html.in * lib/std/enums.zig * lib/std/fmt.zig * lib/std/hash/auto_hash.zig * lib/std/math.zig * lib/std/mem.zig * lib/std/meta.zig * test/behavior/alignof.zig * test/behavior/bitcast.zig * test/behavior/bugs/1421.zig * test/behavior/cast.zig * test/behavior/ptrcast.zig * test/behavior/type_info.zig * test/behavior/vector.zig Master branch added `try` to a bunch of testing function calls, and some lines also had changed how to refer to the native architecture and other `@import("builtin")` stuff.
2021-05-08std: update usage of std.testingVeikka Tuominen
2021-04-15std: change `@import("builtin")` to `std.builtin`Andrew Kelley
2021-04-10lib/std: remove empty init from HashMapUnmanagedMeghan Denny
2021-03-08stage2 cbe: non pointer optionalsVeikka Tuominen
2021-02-27HashMap.put returns !void, not a !booldaurnimator
2021-01-07Add compileError message for StringHashMap in AutoHashMapJulius Putra Tanu Setiaji
2020-12-31Year++Frank Denis
2020-12-09small fixes and zig fmtVexu
2020-11-11std: fix HashMap.clearRetainingCapacityVexu
2020-11-11std: fix HashMap.putAssumeCapacityVexu
2020-09-09Switch type of HashMap's count from usize to u32 (#6262)Zachary Meadows
2020-09-02hash_map: rename to ArrayHashMap and add new HashMap implementationSahnvour
2020-08-20add license header to all std lib filesAndrew Kelley
add SPDX license identifier copyright ownership is zig contributors
2020-08-02.debug_line incremental compilation initial supportAndrew Kelley
Supports writing the first function. Still TODO is: * handling the .debug_line header growing too large * adding a new file to an existing compilation * adding an additional function to an existing file * handling incremental updates * adding the main IR debug ops for IR instructions There are also issues to work out: * readelf --debug-dump=rawline is saying there is no .debug_str section even though there is * readelf --debug-dump=decodedline is saying the file index 0 is bad and reporting some other kind of corruption.
2020-07-26make use of hasUniqueRepresentation to speed up hashing facilities, fastpath ↵Sahnvour
in getAutoHashFn is particularly important for hashmap performance gives a 1.18x speedup on gotta-go-fast hashmap bench
2020-07-13std: add StringHashMapUnmanageddaurnimator
2020-07-10remove stray allocator parameterJosh Wolfe
2020-07-08Merge remote-tracking branch 'origin/master' into register-allocationAndrew Kelley