Mercurial > repos > public > sbplib_julia
annotate 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 |
| 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}} |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 function StaticDict(pairs::Vararg{Pair}) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 K = typejoin(firsttype.(pairs)...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 V = typejoin(secondtype.(pairs)...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 N = length(pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 return StaticDict{K,V,N}(pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 function Base.get(d::StaticDict, key, default) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 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
|
30 if key == p.first |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 return p.second |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 return default |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 firsttype(::Pair{T1,T2}) where {T1,T2} = T1 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 secondtype(::Pair{T1,T2}) where {T1,T2} = T2 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 Base.iterate(d::StaticDict) = iterate(d.pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 Base.iterate(d::StaticDict, state) = iterate(d.pairs,state) |
|
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 Base.length(d::StaticDict) = length(d.pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 |
|
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 # TODO documentation: duplicate keys not allowed atm. will error |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 function Base.merge(d1::StaticDict, d2::StaticDict) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 return StaticDict(d1.pairs..., d2.pairs...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 end # module |
