Mercurial > repos > public > sbplib_julia
comparison src/StaticDicts/StaticDicts.jl @ 719:2f8c67c5979e feature/static_dict
Start adding a StaticDict type
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Tue, 16 Mar 2021 17:28:40 +0100 |
| parents | |
| children | 172c55c4cf2e |
comparison
equal
deleted
inserted
replaced
| 718:05d8ea88c690 | 719:2f8c67c5979e |
|---|---|
| 1 module StaticDicts | |
| 2 | |
| 3 export StaticDict | |
| 4 | |
| 5 # Vidar 2021-02-27 | |
| 6 #NOTE: This type was added since ==-comparison of structs containing | |
| 7 # Dict (even Base.ImmutableDict) fails even though the fields satisfy | |
| 8 # ==-comparison. This is due to the fact that === is called for Dict-fields. | |
| 9 # See https://github.com/JuliaLang/julia/issues/4648. If the PR gets resolved | |
| 10 # we should consider removing StaticDict. | |
| 11 """ | |
| 12 StaticDict{K,V,N}(NTuple{N,Pair{K,V}}) | |
| 13 | |
| 14 A simple static dictonary. Performs lookup using linear search with ==-comparison | |
| 15 of keys. No hashing is used. | |
| 16 """ | |
| 17 struct StaticDict{K,V,N} <: AbstractDict{K,V} | |
| 18 pairs::NTuple{N,Pair{K,V}} | |
| 19 end | |
| 20 | |
| 21 function StaticDict(pairs::Vararg{Pair}) | |
| 22 K = typejoin(firsttype.(pairs)...) | |
| 23 V = typejoin(secondtype.(pairs)...) | |
| 24 N = length(pairs) | |
| 25 return StaticDict{K,V,N}(pairs) | |
| 26 end | |
| 27 | |
| 28 function Base.get(d::StaticDict, key, default) | |
| 29 for p ∈ d.pairs # TBD: Is this the best? Should we use the iterator on `d`? | |
| 30 if key == p.first | |
| 31 return p.second | |
| 32 end | |
| 33 end | |
| 34 | |
| 35 return default | |
| 36 end | |
| 37 | |
| 38 firsttype(::Pair{T1,T2}) where {T1,T2} = T1 | |
| 39 secondtype(::Pair{T1,T2}) where {T1,T2} = T2 | |
| 40 | |
| 41 Base.iterate(d::StaticDict) = iterate(d.pairs) | |
| 42 Base.iterate(d::StaticDict, state) = iterate(d.pairs,state) | |
| 43 | |
| 44 Base.length(d::StaticDict) = length(d.pairs) | |
| 45 | |
| 46 | |
| 47 # TODO documentation: duplicate keys not allowed atm. will error | |
| 48 function Base.merge(d1::StaticDict, d2::StaticDict) | |
| 49 return StaticDict(d1.pairs..., d2.pairs...) | |
| 50 end | |
| 51 | |
| 52 end # module |
