annotate src/StaticDicts/StaticDicts.jl @ 720:172c55c4cf2e feature/static_dict

Dissalow duplicate keys
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 16 Mar 2021 22:35:40 +0100
parents 2f8c67c5979e
children a789e789e30f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
719
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 module StaticDicts
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 export StaticDict
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 # Vidar 2021-02-27
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 #NOTE: This type was added since ==-comparison of structs containing
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 # Dict (even Base.ImmutableDict) fails even though the fields satisfy
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 # ==-comparison. This is due to the fact that === is called for Dict-fields.
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 # See https://github.com/JuliaLang/julia/issues/4648. If the PR gets resolved
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 # we should consider removing StaticDict.
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 """
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 StaticDict{K,V,N}(NTuple{N,Pair{K,V}})
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 A simple static dictonary. Performs lookup using linear search with ==-comparison
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 of keys. No hashing is used.
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 """
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 struct StaticDict{K,V,N} <: AbstractDict{K,V}
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 pairs::NTuple{N,Pair{K,V}}
720
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
19
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
20 # TBD: Why doesn't `pairs::NTuple{N,Pair{K,V}}` work?
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
21 function StaticDict{K,V,N}(pairs::Tuple) where {K,V,N}
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
22 if !allunique(first.(pairs))
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
23 throw(ArgumentError("keys must be unique (for now)"))
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
24 end
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
25
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
26 return new{K,V,N}(pairs)
172c55c4cf2e Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents: 719
diff changeset
27 end
719
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30 function StaticDict(pairs::Vararg{Pair})
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 K = typejoin(firsttype.(pairs)...)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 V = typejoin(secondtype.(pairs)...)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 N = length(pairs)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 return StaticDict{K,V,N}(pairs)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 function Base.get(d::StaticDict, key, default)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 for p ∈ d.pairs # TBD: Is this the best? Should we use the iterator on `d`?
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 if key == p.first
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40 return p.second
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 return default
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 firsttype(::Pair{T1,T2}) where {T1,T2} = T1
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 secondtype(::Pair{T1,T2}) where {T1,T2} = T2
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 Base.iterate(d::StaticDict) = iterate(d.pairs)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 Base.iterate(d::StaticDict, state) = iterate(d.pairs,state)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 Base.length(d::StaticDict) = length(d.pairs)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 # TODO documentation: duplicate keys not allowed atm. will error
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 function Base.merge(d1::StaticDict, d2::StaticDict)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 return StaticDict(d1.pairs..., d2.pairs...)
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 end
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60
2f8c67c5979e Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
61 end # module