...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package trie
31
32 import (
33 "fmt"
34 "strings"
35 )
36
37
38
39
40
41
42
43
44 type Map struct {
45 s Scope
46 n node
47 }
48
49 func (m Map) Scope() Scope {
50 return m.s
51 }
52 func (m Map) Size() int {
53 if m.n == nil {
54 return 0
55 }
56 return m.n.size()
57 }
58 func (m Map) Lookup(k uint64) (interface{}, bool) {
59 if m.n != nil {
60 if leaf := m.n.find(key(k)); leaf != nil {
61 return leaf.v, true
62 }
63 }
64 return nil, false
65 }
66
67
68
69 func (m Map) String() string {
70 var kvs []string
71 m.Range(func(u uint64, i interface{}) bool {
72 kvs = append(kvs, fmt.Sprintf("%d: %s", u, i))
73 return true
74 })
75 return fmt.Sprintf("{%s}", strings.Join(kvs, ", "))
76 }
77
78
79
80
81 func (m Map) Range(cb func(uint64, interface{}) bool) bool {
82 if m.n != nil {
83 return m.n.visit(cb)
84 }
85 return true
86 }
87
88
89
90
91
92 func (m Map) DeepEqual(other Map) bool {
93 if m.Scope() == other.Scope() {
94 return m.n == other.n
95 }
96 if (m.n == nil) || (other.n == nil) {
97 return m.Size() == 0 && other.Size() == 0
98 }
99 return m.n.deepEqual(other.n)
100 }
101
102
103 func Elems(m Map) map[uint64]interface{} {
104 dest := make(map[uint64]interface{}, m.Size())
105 m.Range(func(k uint64, v interface{}) bool {
106 dest[k] = v
107 return true
108 })
109 return dest
110 }
111
112
113
114 type node interface {
115 size() int
116
117
118
119
120 visit(cb func(uint64, interface{}) bool) bool
121
122
123 deepEqual(node) bool
124
125
126 find(k key) *leaf
127
128
129 nodeImpl()
130 }
131
132
133
134
135 type empty struct {
136 s Scope
137 }
138
139
140 type leaf struct {
141 k key
142 v interface{}
143 }
144
145
146
147
148
149
150 type branch struct {
151 sz int
152 prefix prefix
153 branching bitpos
154
155
156
157
158
159
160 left, right node
161 }
162
163
164 var _ node = &empty{}
165 var _ node = &leaf{}
166 var _ node = &branch{}
167
168 func (*empty) nodeImpl() {}
169 func (*leaf) nodeImpl() {}
170 func (*branch) nodeImpl() {}
171
172 func (*empty) find(k key) *leaf { return nil }
173 func (l *leaf) find(k key) *leaf {
174 if k == l.k {
175 return l
176 }
177 return nil
178 }
179 func (br *branch) find(k key) *leaf {
180 kp := prefix(k)
181 if !matchPrefix(kp, br.prefix, br.branching) {
182 return nil
183 }
184 if zeroBit(kp, br.branching) {
185 return br.left.find(k)
186 }
187 return br.right.find(k)
188 }
189
190 func (*empty) size() int { return 0 }
191 func (*leaf) size() int { return 1 }
192 func (br *branch) size() int { return br.sz }
193
194 func (*empty) deepEqual(m node) bool {
195 _, ok := m.(*empty)
196 return ok
197 }
198 func (l *leaf) deepEqual(m node) bool {
199 if m, ok := m.(*leaf); ok {
200 return m == l || (l.k == m.k && l.v == m.v)
201 }
202 return false
203 }
204
205 func (br *branch) deepEqual(m node) bool {
206 if m, ok := m.(*branch); ok {
207 if br == m {
208 return true
209 }
210 return br.sz == m.sz && br.branching == m.branching && br.prefix == m.prefix &&
211 br.left.deepEqual(m.left) && br.right.deepEqual(m.right)
212 }
213
214
215 return false
216 }
217
218 func (*empty) visit(cb func(uint64, interface{}) bool) bool {
219 return true
220 }
221 func (l *leaf) visit(cb func(uint64, interface{}) bool) bool {
222 return cb(uint64(l.k), l.v)
223 }
224 func (br *branch) visit(cb func(uint64, interface{}) bool) bool {
225 if !br.left.visit(cb) {
226 return false
227 }
228 return br.right.visit(cb)
229 }
230
View as plain text