annotate src/StaticDicts/StaticDicts.jl @ 877:dd2ab001a7b6 feature/equidistant_grid/refine

Implement refine function, move exports to the top of the file, change location of constuctors. The constructors were changed have only one inner constructor and simpler outer constructors.
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 14 Feb 2022 09:39:58 +0100
parents ff9d738c9b21
children
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 """
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
3e0b0b44868e More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 726
diff changeset
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
3e0b0b44868e More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 726
diff changeset
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
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
19
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
20 Duplicate keys are not allowed and an error will be thrown if they are passed
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
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
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
57 """
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
58 merge(d1::StaticDict, d2::StaticDict)
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
59
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
60 Merge two `StaticDict`. Repeating keys is considered and error. This may
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
61 change in a future version.
103f61d09a8b More documentation
Jonatan Werpers <jonatan@werpers.com>
parents: 725
diff changeset
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