Fast fixed-size dicts wth eraseable entries for keys that are or that map to sequential indicies.
Purpose
- Provide dictionaries where the keys are indicies 1:n, and the values are any shared type.
- The maximum number of entries is set at construction, but any/many/all may be unvalued.
- Values may be entered, altered or cleared at any time.
- Clearing a value may be interpreted as setting it to unavailable, unknown, or unused.
- For immutably typed values, set/get/reset/clear times are very fast.
Overview
This small package that couples a BitVector with a preallocated Vector{T} for some T to allow faster get/set for sequentially available information (or naturally 1:n keyed values). Values may be set, changed or cleared (missing, like NA/Null). The semantics for unavailable values is up to you.
Design
Each CardinalDict pairs a word indexed bitset encoding the presence of indexable values with preallocated, contiguous memory holding the values (directly, if immutable). Values are retrieved ionly if they are set (not clear/empty). Values are resettable with any valuesof the same type.
Exports
CardinalDict, keymax(dict::CardinalDict), clearindex!(dict:CardinalDict, key::Integer), isfull(dict:CardinalDict)
- clearindex! is like delete! if delete! returned nothing
- isfull is the dual of isempty
- keymax is the largest key for a given CardinalDict (established at construction)
Provides
==, !=, length, isempty, endof, eltype, keys, values, getindex, setindex!, delete!, empty!,
get(dict::CardinalDict{K,V}, key::K, default::V), get!(dict::CardinalDict{K,V}, key::K, default::V),
start, next, done, in (and ∈, ∋, ∉, ∌), string, show
Your favorite Dict functions should work. If there is something missing, please add an issue.
Use
lookup oft-used naturally sequenced values
#=
create an CardinalDict with indices 1:20 that holds Int64 values
populate it
use it
unset an index
check it
check length, endof, keymax
=#
using CardinalDicts
factorials = CardinalDict{Int64}(20);
for i in 1:18
setindex!(factorials, factorial(i), i)
end
haskey(factorials, 10) == true
clearindex!(facorials, 10)
haskey(factorials, 10) == fakse
length(factorials) == 17
ehdof(factorials) == 18
keymax(factorials) == 20
construct from a vector
using CardinalDicts
vec = [1.0, 3.0, 2.0]
dict = CardinalDict(vec)
dict[2] == 3.0
Please let me know if you are using this package.