Destruct.
No copying.
Element type.
Type of key stored.
Type of value stored.
Increase value at key, or set value to 1 if key hasn't yet been added.
Empty.
Check if element is stored.
Duplicate.
Get value of key or defaultValue if key not present (and therefore nothrow).
Insert element, being either a key-value (map-case) or a just a key (set-case).
Insert or replace value at key.
Insert element like with insert() without automatic growth of number of bins.
Insert elements, all being either a key-value (map-case) or a just a key (set-case).
Equality.
Indexing.
Supports aakey = value; syntax.
Range over elements of r-value instance of this.
Returns forward range that iterates through the keys and values of this.
Rehash.
Remove element and, when possible, shrink its large bin to small.
Reserve rom for extraCapacity number of extra buckets.
In the hash map case, V is non-void, and a value is stored alongside the key of type K.
Maximum number of elements that fits in a small bin (SmallBin).
Get bin count.
Returns forward range that iterates through the keys of this.
Returns forward range that iterates through the keys and values of this.
Returns forward range that iterates through the values of this.
Check if empty.
Get length (read-only).
Get key part of element.
Get key part of element.
Get reference to key part of element.
Get reference to key part of element.
Get value part of element.
Make with room for storing at least capacity number of elements.
Make with elements.
Bin count statistics.
Mutable element reference with constant key and mutable value.
Constant element reference with both constant key and value.
key type.
value type.
memory allocator for bin array and large bins (LargeBin)
hash function or std.digest Hash.
minimum capacity of small bin
https://probablydance.com/2017/02/26/i-wrote-the-fastest-hashtable/
TODO: support HashSet-in operator: assert(*("a" in s) == "a");
TODO: in non-sso optimized store add flag similar to Nullable that reserves a specific value for key that indicates that slot is unused. Use this when storing indexes in knet.storage
TODO: add extractElement that moves it out similar to http://en.cppreference.com/w/cpp/container/unordered_set/extract
TODO: add merge or union algorithm here or into container_algorithm.d. See also: http://en.cppreference.com/w/cpp/container/unordered_set/merge. this algorithm moves elements from source if they are not already in this
TODO: adjust rehashing to occur when relative number of LargeBuckets is larger than, say, 1/10. Experiment with different ratios.
TODO: add template parameter alias nullKeyValue that avoids having to store bstates when smallBinCapacity == 1, similar to: std.typecons.nullable(alias nullValue, T)( T t )
TODO: add flag for use of growth factor smaller than powers of two. use prime_modulo.d
TODO: use core.bitop : bsr, bsl to find first empty element in bin. if as fast as current find use it to optimize remove()
TODO: Avoid extra length and capacity in _statuses (length or large) by making it allocate in sync with bins (using soa.d).
TODO: also try allocating values in a separate array using soa.d and see if benchmarks become better
TODO: growWithExtraCapacity(): if allocator has realloc we can do rehashing in-place similar to reordering in in-place radix (integer_sorting.d), otherwise rehash into new copy of bins and free old bins when done. If bin element count is > 1 this is more complicated since each bin contains a set of elements to swap out and must be put in a queue.
TODO: benchmark against https://github.com/greg7mdp/sparsepp
Hash set (or map) storing (key) elements of type K and values of type V.
Uses small-size-optimized (SSO) arrays as bins, having a more stable worst-case performance than open-addressing.