Mercurial > repos > public > sbplib_julia
annotate src/StaticDicts/StaticDicts.jl @ 980:f885e1de6dc4 feature/variable_derivatives
Merge default
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 15 Mar 2022 21:38:55 +0100 |
parents | ff9d738c9b21 |
children |
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 """ |
739
e716602f1d62
Fix documentation and remove TBD
Jonatan Werpers <jonatan@werpers.com>
parents:
737
diff
changeset
|
6 StaticDict{K,V,N} <: AbstractDict{K,V} |
724
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
7 |
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
8 A static dictionary implementing the interface for an `AbstractDict`. A |
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
9 `StaticDict` is fully immutable and after creation no changes can be made. |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 |
739
e716602f1d62
Fix documentation and remove TBD
Jonatan Werpers <jonatan@werpers.com>
parents:
737
diff
changeset
|
11 The immutable nature means that `StaticDict` can be compared with `===`, in |
e716602f1d62
Fix documentation and remove TBD
Jonatan Werpers <jonatan@werpers.com>
parents:
737
diff
changeset
|
12 constrast to regular `Dict` or `ImmutableDict` which can not. (See |
854
ff9d738c9b21
Fix typos in doc.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
838
diff
changeset
|
13 <https://github.com/JuliaLang/julia/issues/4648> for details.) One important |
735 | 14 aspect of this is that `StaticDict` can be used in a struct while still |
854
ff9d738c9b21
Fix typos in doc.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
838
diff
changeset
|
15 allowing the struct to be compared using the default implementation of `==` for |
735 | 16 structs. |
724
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
17 |
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
18 Lookups are done by linear search. |
726 | 19 |
20 Duplicate keys are not allowed and an error will be thrown if they are passed | |
21 to the constructor. | |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 """ |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 struct StaticDict{K,V,N} <: AbstractDict{K,V} |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 pairs::NTuple{N,Pair{K,V}} |
720
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
25 |
741
94941a062124
Add tests for constructing empty dicts. Change constructors accordingly
Jonatan Werpers <jonatan@werpers.com>
parents:
739
diff
changeset
|
26 function StaticDict{K,V}(pairs::Vararg{Pair,N}) where {K,V,N} |
720
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
27 if !allunique(first.(pairs)) |
737
ca4f17efb279
Change to using DomainError
Jonatan Werpers <jonatan@werpers.com>
parents:
736
diff
changeset
|
28 throw(DomainError(pairs, "keys must be unique")) |
720
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
29 end |
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
30 return new{K,V,N}(pairs) |
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
31 end |
719
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 |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 function StaticDict(pairs::Vararg{Pair}) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 K = typejoin(firsttype.(pairs)...) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 V = typejoin(secondtype.(pairs)...) |
741
94941a062124
Add tests for constructing empty dicts. Change constructors accordingly
Jonatan Werpers <jonatan@werpers.com>
parents:
739
diff
changeset
|
37 return StaticDict{K,V}(pairs...) |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
736
b5d9fbcdcef1
Add a constuctor taking a tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
735
diff
changeset
|
40 StaticDict(pairs::NTuple{N,Pair} where N) = StaticDict(pairs...) |
b5d9fbcdcef1
Add a constuctor taking a tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
735
diff
changeset
|
41 |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 function Base.get(d::StaticDict, key, default) |
739
e716602f1d62
Fix documentation and remove TBD
Jonatan Werpers <jonatan@werpers.com>
parents:
737
diff
changeset
|
43 for p ∈ d.pairs |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 if key == p.first |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 return p.second |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 end |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 end |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 return default |
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 Base.iterate(d::StaticDict) = iterate(d.pairs) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 Base.iterate(d::StaticDict, state) = iterate(d.pairs,state) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 Base.length(d::StaticDict) = length(d.pairs) |
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 |
726 | 57 """ |
58 merge(d1::StaticDict, d2::StaticDict) | |
59 | |
60 Merge two `StaticDict`. Repeating keys is considered and error. This may | |
61 change in a future version. | |
62 """ | |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 function Base.merge(d1::StaticDict, d2::StaticDict) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 return StaticDict(d1.pairs..., d2.pairs...) |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 end |
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 |
725
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
67 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
68 """ |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
69 firsttype(::Pair{T1,T2}) |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
70 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
71 The type of the first element in the pair. |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
72 """ |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
73 firsttype(::Pair{T1,T2}) where {T1,T2} = T1 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
74 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
75 """ |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
76 secondtype(::Pair{T1,T2}) |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
77 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
78 The type of the secondtype element in the pair. |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
79 """ |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
80 secondtype(::Pair{T1,T2}) where {T1,T2} = T2 |
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
81 |
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
82 end # module |