1impl<'a,K,M:DiscreteMetric<K,Q>,Q,V> Iterator for CloseKeyIter<'a,K,M,Q,V>{
2 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(k,_v,d)|(k,d))}
3 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
4 type Item=(&'a K,usize);
5}
6impl<'a,K,M:DiscreteMetric<K,Q>,Q,V> Iterator for CloseMapIter<'a,K,M,Q,V>{
7 fn next(&mut self)->Option<Self::Item>{
8 let (maxdistance,metric)=(self.maxdistance,self.metric);
9 let key=&self.key;
10 let nodes=&mut self.nodes;
11
12 while let Some(n)=nodes.pop(){
13 let (k,v,next)=(&n.key,&n.value,&n.connections);
14 let distance=metric.distance(k,key);
15 self.remaining-=1;
16
17 nodes.extend(next.range(distance.saturating_sub(maxdistance)..=distance.saturating_add(maxdistance)).map(|(_r,n)|n));
18 if distance<=maxdistance{return Some((k,v,distance))}
19 }
20 None
21 }
22 fn size_hint(&self)->(usize,Option<usize>){(0,Some(self.remaining))}
23 type Item=(&'a K,&'a V,usize);
24}
25impl<'a,K,M:DiscreteMetric<K,Q>,Q,V> Iterator for CloseValIter<'a,K,M,Q,V>{
26 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(_k,v,d)|(v,d))}
27 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
28 type Item=(&'a V,usize);
29}
30impl<'a,K,M,Q:Clone,V> Clone for CloseKeyIter<'a,K,M,Q,V>{
31 fn clone(&self)->Self{
32 Self{inner:self.inner.clone()}
33 }
34 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
35}
36impl<'a,K,M,Q:Clone,V> Clone for CloseMapIter<'a,K,M,Q,V>{
37 fn clone(&self)->Self{
38 Self{key:self.key.clone(),maxdistance:self.maxdistance,metric:self.metric,nodes:self.nodes.clone(),remaining:self.remaining}
39 }
40 fn clone_from(&mut self,other:&Self){
41 (self.key.clone_from(&other.key),self.nodes.clone_from(&other.nodes));
42 (self.maxdistance,self.metric,self.remaining)=(other.maxdistance,other.metric,other.remaining);
43 }
44}
45impl<'a,K,M,Q:Clone,V> Clone for CloseValIter<'a,K,M,Q,V>{
46 fn clone(&self)->Self{
47 Self{inner:self.inner.clone()}
48 }
49 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
50}
51impl<'a,K,M,V> IntoIterator for &'a BKTreeMap<K,M,V>{
52 fn into_iter(self)->Self::IntoIter{self.iter()}
53 type IntoIter=MapIter<'a,K,V>;
54 type Item=(&'a K,&'a V);
55}
56impl<'a,K,M,V> IntoIterator for &'a mut BKTreeMap<K,M,V>{
57 fn into_iter(self)->Self::IntoIter{self.iter_mut()}
58 type IntoIter=MapIterMut<'a,K,V>;
59 type Item=(&'a K,&'a mut V);
60}
61impl<'a,K,V> Clone for KeyIter<'a,K,V>{
62 fn clone(&self)->Self{
63 Self{inner:self.inner.clone()}
64 }
65 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
66}
67impl<'a,K,V> Clone for MapIter<'a,K,V>{
68 fn clone(&self)->Self{
69 Self{nodes:self.nodes.clone(),remaining:self.remaining}
70 }
71 fn clone_from(&mut self,other:&Self){
72 self.nodes.clone_from(&other.nodes);
73 self.remaining=other.remaining;
74 }
75}
76impl<'a,K,V> Clone for ValIter<'a,K,V>{
77 fn clone(&self)->Self{
78 Self{inner:self.inner.clone()}
79 }
80 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
81}
82impl<'a,K,V> ExactSizeIterator for KeyIter<'a,K,V>{
83 fn len(&self)->usize{self.inner.len()}
84}
85impl<'a,K,V> ExactSizeIterator for MapIter<'a,K,V>{
86 fn len(&self)->usize{self.remaining}
87}
88impl<'a,K,V> ExactSizeIterator for MapIterMut<'a,K,V>{
89 fn len(&self)->usize{self.remaining}
90}
91impl<'a,K,V> ExactSizeIterator for ValIter<'a,K,V>{
92 fn len(&self)->usize{self.inner.len()}
93}
94impl<'a,K,V> Iterator for KeyIter<'a,K,V>{
95 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(k,_v)|k)}
96 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
97 type Item=&'a K;
98}
99impl<'a,K,V> Iterator for MapIter<'a,K,V>{
100 fn next(&mut self)->Option<Self::Item>{
101 let nodes=&mut self.nodes;
102 let node=nodes.pop()?;
103 let (k,v,next)=(&node.key,&node.value,&node.connections);
104 self.remaining-=1;
105
106 nodes.extend(next.values());
107 Some((k,v))
108 }
109 fn size_hint(&self)->(usize,Option<usize>){(self.remaining,Some(self.remaining))}
110 type Item=(&'a K,&'a V);
111}
112impl<'a,K,V> Iterator for MapIterMut<'a,K,V>{
113 fn next(&mut self)->Option<Self::Item>{
114 let nodes=&mut self.nodes;
115 let node=nodes.pop()?;
116 let (k,v,next)=(&node.key,&mut node.value,&mut node.connections);
117 self.remaining-=1;
118
119 nodes.extend(next.values_mut());
120 Some((k,v))
121 }
122 fn size_hint(&self)->(usize,Option<usize>){(self.remaining,Some(self.remaining))}
123 type Item=(&'a K,&'a mut V);
124}
125impl<'a,K,V> Iterator for ValIter<'a,K,V>{
126 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(_k,v)|v)}
127 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
128 type Item=&'a V;
129}
130impl<'a,K,V> Iterator for ValIterMut<'a,K,V>{
131 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(_k,v)|v)}
132 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
133 type Item=&'a mut V;
134}
135impl<K:Clone,V:Clone> Clone for IntoKeysIter<K,V>{
136 fn clone(&self)->Self{
137 Self{inner:self.inner.clone()}
138 }
139 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
140}
141impl<K:Clone,V:Clone> Clone for IntoValsIter<K,V>{
142 fn clone(&self)->Self{
143 Self{inner:self.inner.clone()}
144 }
145 fn clone_from(&mut self,other:&Self){self.inner.clone_from(&other.inner)}
146}
147impl<K:Clone,V:Clone> Clone for MapIntoIter<K,V>{
148 fn clone(&self)->Self{
149 let nodes=&self.nodes;
150 let remaining=self.remaining;
151
152 let nodes=MapIter::<K,V>{nodes:nodes.iter().collect(),remaining}.map(|(k,v)|Node::new(k.clone(),v.clone())).collect();
153 Self{nodes,remaining}
154 }
155 fn clone_from(&mut self,other:&Self){
156 let remaining=other.remaining;
157 let nodes=MapIter::<K,V>{nodes:other.nodes.iter().collect(),remaining}.map(|(k,v)|Node::new(k.clone(),v.clone()));
158
159 self.nodes.clear();
160 self.nodes.extend(nodes);
161 self.remaining=remaining;
162 }
163}
164impl<K,M:Default+DiscreteMetric<K,K>,V> FromIterator<(K,V)> for BKTreeMap<K,M,V>{
165 fn from_iter<I:IntoIterator<Item=(K,V)>>(iter:I)->Self{
166 let mut map=Self::default();
167 iter.into_iter().map(|(k,v)|map.insert(k,v)).for_each(|_|());
168 map
169 }
170}
171impl<K,M:Default,V> Default for BKTreeMap<K,M,V>{
172 fn default()->Self{Self::new(M::default())}
173}
174impl<K,M:DiscreteMetric<K,K>,V> Extend<(K,V)> for BKTreeMap<K,M,V>{
175 fn extend<I:IntoIterator<Item=(K,V)>>(&mut self,iter:I){iter.into_iter().map(|(k,v)|self.insert(k,v)).for_each(|_|())}
176}
177impl<K,M:DiscreteMetric<K,Q>,Q,V> Index<&Q> for BKTreeMap<K,M,V>{
178 fn index(&self,index:&Q)->&Self::Output{self.get(index,0).map(|(v,_d)|v).expect("mapping must exist to use index")}
179 type Output=V;
180}
181impl<K,M:DiscreteMetric<K,Q>,Q,V> IndexMut<&Q> for BKTreeMap<K,M,V>{
182 fn index_mut(&mut self,index:&Q)->&mut Self::Output{self.get_mut(index,0).map(|(v,_d)|v).expect("mapping must exist to use index")}
183}
184impl<K,M,V> AsMut<Self> for BKTreeMap<K,M,V>{
185 fn as_mut(&mut self)->&mut Self{self}
186}
187impl<K,M,V> AsRef<Self> for BKTreeMap<K,M,V>{
188 fn as_ref(&self)->&Self{self}
189}
190impl<K,M,V> BKTreeMap<K,M,V>{pub fn append<M2>(&mut self,other:&mut BKTreeMap<K,M2,V>) where M:DiscreteMetric<K,K>{
193 fn explore<K,M:DiscreteMetric<K,K>,V>(node:Node<K,V>,tree:&mut BKTreeMap<K,M,V>){
194 let (k,v,next)=(node.key,node.value,node.connections);
195 tree.insert(k,v);
196 next.into_iter().for_each(|(_d,n)|explore(n,tree));
197 }
198
199 if let Some(n)=other.root.take(){explore(n,self)}
200 }
201 pub fn clear(&mut self){
203 self.length=0;
204 self.root=None;
205 }
206 pub fn close_iter<Q>(&self,key:Q,maxdistance:usize)->CloseMapIter<'_,K,M,Q,V> where M:DiscreteMetric<K,Q>{CloseMapIter{key,maxdistance,metric:&self.metric,nodes:self.root.as_ref().into_iter().collect(),remaining:self.length}
209 }
210 pub fn close_keys<Q>(&self,key:Q,maxdistance:usize)->CloseKeyIter<'_,K,M,Q,V> where M:DiscreteMetric<K,Q>{
212 CloseKeyIter{inner:self.close_iter(key,maxdistance)}
213 }
214 pub fn close_values<Q>(&self,key:Q,maxdistance:usize)->CloseValIter<'_,K,M,Q,V> where M:DiscreteMetric<K,Q>{
216 CloseValIter{inner:self.close_iter(key,maxdistance)}
217 }
218 pub fn close_sorted<'a,Q:?Sized>(&self,key:&Q,maxdistance:usize)->Vec<(&K,&V,usize)> where M:DiscreteMetric<K,Q>{
220 fn explore<'a,K,M:DiscreteMetric<K,Q>,Q:?Sized,V>(key:&Q,maxdistance:usize,metric:&M,node:&'a Node<K,V>,results:&mut Vec<(&'a K,&'a V,usize)>){
221 let distance=metric.distance(&node.key,key);
222
223 if distance<=maxdistance{results.push((&node.key,&node.value,distance))}
224 node.connections.range(distance.saturating_sub(maxdistance)..=distance.saturating_add(maxdistance)).for_each(|(_d,n)|explore(key,maxdistance,metric,n,results));
225 }
226 let metric=&self.metric;
227 let root=if let Some(r)=&self.root{r}else{return Vec::new()};
228 let mut results=Vec::with_capacity(10);
229
230 explore(key,maxdistance,metric,root,&mut results);
231 results.sort_unstable_by_key(|(_k,_v,d)|*d);
232 results
233 }
234 pub fn close_sorted_mut<'a,Q:?Sized>(&mut self,key:&Q,maxdistance:usize)->Vec<(&K,&mut V,usize)> where M:DiscreteMetric<K,Q>{
236 fn explore<'a,K,M:DiscreteMetric<K,Q>,Q:?Sized,V>(key:&Q,maxdistance:usize,metric:&M,node:&'a mut Node<K,V>,results:&mut Vec<(&'a K,&'a mut V,usize)>){
237 let distance=metric.distance(&node.key,key);
238
239 if distance<=maxdistance{results.push((&node.key,&mut node.value,distance))}
240 node.connections.range_mut(distance.saturating_sub(maxdistance)..=distance.saturating_add(maxdistance)).for_each(|(_d,n)|explore(key,maxdistance,metric,n,results));
241 }
242 let metric=&self.metric;
243 let root=if let Some(r)=&mut self.root{r}else{return Vec::new()};
244 let mut results=Vec::with_capacity(10);
245
246 explore(key,maxdistance,metric,root,&mut results);
247 results.sort_unstable_by_key(|(_k,_v,d)|*d);
248 results
249 }
250 pub fn contains_key<Q:?Sized>(&self,key:&Q,maxdistance:usize)->bool where M:DiscreteMetric<K,Q>{self.get_key_value(key,maxdistance).is_some()}
252 pub fn get<Q:?Sized>(&self,key:&Q,maxdistance:usize)->Option<(&V,usize)> where M:DiscreteMetric<K,Q>{self.get_key_value(key,maxdistance).map(|(_k,v,d)|(v,d))}
254 pub fn get_key_value<Q:?Sized>(&self,key:&Q,maxdistance:usize)->Option<(&K,&V,usize)> where M:DiscreteMetric<K,Q>{
256 fn explore<'a,K,M:DiscreteMetric<K,Q>,Q:?Sized,V>(key:&Q,maxdistance:usize,metric:&M,node:&'a Node<K,V>)->Option<(&'a K,&'a V,usize)>{
257 let distance=metric.distance(&node.key,key);
258
259 if distance==0{return Some((&node.key,&node.value,0))}
260 let includecurrent=distance<=maxdistance;
261 let nextnodes=node.connections.range(distance.saturating_sub(maxdistance)..=distance.saturating_add(maxdistance)).filter_map(|(_d,n)|explore(key,maxdistance,metric,n));
262 nextnodes.chain(includecurrent.then_some((&node.key,&node.value,distance))).min_by_key(|(_k,_v,d)|*d)
263 }
264 let metric=&self.metric;
265 let root=if let Some(r)=&self.root{r}else{return None};
266
267 explore(key,maxdistance,metric,root)
268 }
269 pub fn get_mut<Q:?Sized>(&mut self,key:&Q,maxdistance:usize)->Option<(&mut V,usize)> where M:DiscreteMetric<K,Q>{
271 fn explore<'a,K,M:DiscreteMetric<K,Q>,Q:?Sized,V>(key:&Q,maxdistance:usize,metric:&M,node:&'a mut Node<K,V>)->Option<(&'a mut V,usize)>{
272 let distance=metric.distance(&node.key,key);
273
274 if distance==0{return Some((&mut node.value,0))}
275 let includecurrent=distance<=maxdistance;
276 let nextnodes=node.connections.range_mut(distance.saturating_sub(maxdistance)..=distance.saturating_add(maxdistance)).filter_map(|(_d,n)|explore(key,maxdistance,metric,n));
277 nextnodes.chain(includecurrent.then_some((&mut node.value,distance))).min_by_key(|(_v,d)|*d)
278 }
279 let metric=&self.metric;
280 let root=if let Some(r)=&mut self.root{r}else{return None};
281
282 explore(key,maxdistance,metric,root)
283 }
284 pub fn insert(&mut self,key:K,value:V)->Option<V> where M:DiscreteMetric<K,K>{
286 let metric=&self.metric;
287 let root=if let Some(n)=self.root.as_mut(){
288 n
289 }else{
290 self.length+=1;
291 self.root=Some(Node::new(key,value));
292 return None;
293 };
294
295 if let Some(v)=root.insert(key,metric,value){return Some(v)}
296 self.length+=1;
297 None
298 }
299 pub fn into_keys(self)->IntoKeysIter<K,V>{
301 IntoKeysIter{inner:self.into_iter()}
302 }
303 pub fn into_values(self)->IntoValsIter<K,V>{
305 IntoValsIter{inner:self.into_iter()}
306 }
307 pub fn is_empty(&self)->bool{self.length==0}
309 pub fn iter(&self)->MapIter<'_,K,V>{
311 MapIter{nodes:self.root.as_ref().into_iter().collect(),remaining:self.length}
312 }
313 pub fn iter_mut(&mut self)->MapIterMut<'_,K,V>{
315 MapIterMut{nodes:self.root.as_mut().into_iter().collect(),remaining:self.length}
316 }
317 pub fn keys(&self)->KeyIter<'_,K,V>{
319 KeyIter{inner:self.iter()}
320 }
321 pub fn metric(&self)->&M{&self.metric}
323 pub fn len(&self)->usize{self.length}
325 pub fn new(metric:M)->Self{
327 Self{length:0,metric,root:None}
328 }
329 pub fn remove<Q:?Sized>(&mut self,key:&Q,maxdistance:usize)->Option<(V,usize)> where M:DiscreteMetric<K,K>+DiscreteMetric<K,Q>{self.remove_entry(key,maxdistance).map(|(_k,v,d)|(v,d))}
331 pub fn remove_entry<Q:?Sized>(&mut self,key:&Q,maxdistance:usize)->Option<(K,V,usize)> where M:DiscreteMetric<K,K>+DiscreteMetric<K,Q>{
333 fn restore_nodes<K,M:DiscreteMetric<K,K>,V>(branch:&mut Node<K,V>,metric:&M,nodes:BTreeMap<usize,Node<K,V>>){
334 nodes.into_iter().for_each(|(_d,n)|{
335 branch.insert(n.key,metric,n.value);
336 restore_nodes(branch,metric,n.connections);
337 })
338 }
339 let metric=&self.metric;
340 let mut path=Vec::with_capacity(10);
341 let mut branch=if let Some(r)=&mut self.root{r}else{return None};
342 let nodedistance=branch.get_path(key,maxdistance,metric,&mut path);
343 if nodedistance>maxdistance{return None}
344 let mut path=path.into_iter();
345 let lastindex=path.next_back();
346 for i in path{branch=branch.connections.get_mut(&i).unwrap()}
347 self.length-=1;
348 if let Some(i)=lastindex{
349 let node=branch.connections.remove(&i).unwrap();
350 restore_nodes(branch,metric,node.connections);
351 return Some((node.key,node.value,nodedistance))
352 }
353 let mut oldroot=self.root.take().unwrap();
354 if let Some((_d,mut newroot))=oldroot.connections.pop_first(){
355 restore_nodes(&mut newroot,metric,oldroot.connections);
356 self.root=Some(newroot);
357 }
358 Some((oldroot.key,oldroot.value,nodedistance))
359 }
360 pub fn retain<F:FnMut(&K,&mut V)->bool>(&mut self,mut f:F) where M:DiscreteMetric<K,K>{
362 fn explore<F:FnMut(&K,&mut V)->bool,K,M:DiscreteMetric<K,K>,V>(f:&mut F,node:Node<K,V>,tree:&mut BKTreeMap<K,M,V>){
363 let (connections,key)=(node.connections,node.key);
364 let mut value=node.value;
365
366 if f(&key,&mut value){
367 tree.insert(key,value);
368 }
369 for n in connections.into_values(){explore(f,n,tree)}
370 }
371 let root=if let Some(r)=self.root.take(){r}else{return};
372 self.length=0;
373 explore(&mut f,root,self);
374 }
375 pub fn values(&self)->ValIter<'_,K,V>{
377 ValIter{inner:self.iter()}
378 }
379 pub fn values_mut(&mut self)->ValIterMut<'_,K,V>{
381 ValIterMut{inner:self.iter_mut()}
382 }
383}
384impl<K,M,V> IntoIterator for BKTreeMap<K,M,V>{
385 fn into_iter(self)->Self::IntoIter{
386 MapIntoIter{nodes:self.root.into_iter().collect(),remaining:self.length}
387 }
388 type IntoIter=MapIntoIter<K,V>;
389 type Item=(K,V);
390}
391impl<K,V> ExactSizeIterator for IntoKeysIter<K,V>{
392 fn len(&self)->usize{self.inner.len()}
393}
394impl<K,V> ExactSizeIterator for IntoValsIter<K,V>{
395 fn len(&self)->usize{self.inner.len()}
396}
397impl<K,V> ExactSizeIterator for MapIntoIter<K,V>{
398 fn len(&self)->usize{self.remaining}
399}
400impl<K,V> Iterator for IntoKeysIter<K,V>{
401 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(k,_v)|k)}
402 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
403 type Item=K;
404}
405impl<K,V> Iterator for IntoValsIter<K,V>{
406 fn next(&mut self)->Option<Self::Item>{self.inner.next().map(|(_k,v)|v)}
407 fn size_hint(&self)->(usize,Option<usize>){self.inner.size_hint()}
408 type Item=V;
409}
410impl<K,V> Iterator for MapIntoIter<K,V>{
411 fn next(&mut self)->Option<Self::Item>{
412 let nodes=&mut self.nodes;
413 let node=nodes.pop()?;
414 let (k,v,next)=(node.key,node.value,node.connections);
415 self.remaining-=1;
416
417 nodes.extend(next.into_values());
418 Some((k,v))
419 }
420 fn size_hint(&self)->(usize,Option<usize>){(self.remaining,Some(self.remaining))}
421 type Item=(K,V);
422}
423impl<K,V> Node<K,V>{
424 fn get_path<M:DiscreteMetric<K,Q>,Q:?Sized>(&self,key:&Q,maxdistance:usize,metric:&M,v:&mut Vec<usize>)->usize{
426 let mut mindistance=metric.distance(&self.key,key);
427 if mindistance==0{return 0}
428 let l0=v.len();
429 for (i,n) in self.connections.range(mindistance.saturating_sub(maxdistance)..=mindistance.saturating_add(maxdistance)){
430 let l1=v.len();
431 v.push(*i);
432 let candidatedistance=n.get_path(key,maxdistance,metric,v);
433 if candidatedistance<=maxdistance&&candidatedistance<mindistance{
434 mindistance=candidatedistance;
435 v.drain(l0..l1);
436 }else{
437 v.truncate(l1);
438 }
439 }
440 mindistance
441 }
442 fn insert<M:DiscreteMetric<K,K>>(&mut self,key:K,metric:&M,value:V)->Option<V>{
444 let (mut k,mut v)=(Some(key),Some(value));
445 let mut node=self;
446
447 loop{
448 let distance=if let Some(k)=&k{metric.distance(k,&node.key)}else{break};
449 if distance==0{return Some(replace(&mut node.value,v.unwrap()))}
450 node=node.connections.entry(distance).or_insert_with(||Node::new(k.take().unwrap(),v.take().unwrap()));
451 }
452 None
453 }
454 fn new(key:K,value:V)->Self{
456 Self{connections:BTreeMap::new(),key,value}
457 }
458}
459#[cfg(test)]
460mod tests{
461 #[test]
462 fn insert_get_rectangle(){
463 let mut map=BKTreeMap::new(Cheb2D);
464
465 assert_eq!(map.insert((-1,-1),'A'),None);
466 assert_eq!(map.insert((-1,2),'B'),None);
467 assert_eq!(map.insert((1,-1),'C'),None);
468 assert_eq!(map.insert((1,2),'D'),None);
469 assert_eq!(map.insert((-1,2),'b'),Some('B'));
470 assert_eq!(map.insert((1,2),'d'),Some('D'));
471 assert_eq!(map.insert((1,-1),'c'),Some('C'));
472 assert_eq!(map.insert((-1,-1),'a'),Some('A'));
473 assert_eq!(map.len(),4);
474
475 for n in 0..10{
476 assert_eq!(map.get_key_value(&(-1,-1),n),Some((&(-1,-1),&'a',0)));
477 assert_eq!(map.get_key_value(&(-1,2),n),Some((&(-1,2),&'b',0)));
478 assert_eq!(map.get_key_value(&(1,-1),n),Some((&(1,-1),&'c',0)));
479 assert_eq!(map.get_key_value(&(1,2),n),Some((&(1,2),&'d',0)));
480 }
481
482 assert_eq!(map.get_key_value(&(-1,-2),0),None);
483 assert_eq!(map.get_key_value(&(-1,3),0),None);
484 assert_eq!(map.get_key_value(&(2,-1),0),None);
485 assert_eq!(map.get_key_value(&(2,1),0),None);
486
487 assert_eq!(map.get_key_value(&(-1,-2),1),Some((&(-1,-1),&'a',1)));
488 assert_eq!(map.get_key_value(&(-1,3),1),Some((&(-1,2),&'b',1)));
489 assert_eq!(map.get_key_value(&(2,-1),1),Some((&(1,-1),&'c',1)));
490 assert_eq!(map.get_key_value(&(2,2),1),Some((&(1,2),&'d',1)));
491 }
492 #[test]
493 fn insert_remove_rectangle(){
494 let mut map=BKTreeMap::new(Cheb2D);
495
496 assert_eq!(map.insert((-1,-1),'A'),None);
497 assert_eq!(map.insert((-1,2),'B'),None);
498 assert_eq!(map.insert((1,-1),'C'),None);
499 assert_eq!(map.insert((1,2),'D'),None);
500
501 assert_eq!(map.remove(&(-1,2),0),Some(('B',0)));
502 assert_eq!(map.len(),3);
503 assert_eq!(map.remove(&(1,2),0),Some(('D',0)));
504 assert_eq!(map.len(),2);
505 assert_eq!(map.remove(&(1,-1),0),Some(('C',0)));
506 assert_eq!(map.len(),1);
507 assert_eq!(map.remove(&(-1,-1),0),Some(('A',0)));
508 assert_eq!(map.len(),0);
509
510 for n in 0..10{
511 assert_eq!(map.insert((-1,-1),'a'),None);
512 assert_eq!(map.insert((-1,2),'b'),None);
513 assert_eq!(map.insert((1,-1),'c'),None);
514 assert_eq!(map.insert((1,2),'d'),None);
515 assert_eq!(map.len(),4);
516
517 assert_eq!(map.remove(&(-1,-1),n),Some(('a',0)));
518 assert_eq!(map.get_key_value(&(-1,3),1),Some((&(-1,2),&'b',1)));
519 assert_eq!(map.get_key_value(&(2,-1),1),Some((&(1,-1),&'c',1)));
520 assert_eq!(map.remove(&(-1,2),n),Some(('b',0)));
521 assert_eq!(map.len(),2);
522 assert_eq!(map.remove(&(1,-1),n),Some(('c',0)));
523 assert_eq!(map.len(),1);
524 assert_eq!(map.remove(&(1,2),n),Some(('d',0)));
525 }
526
527 assert_eq!(map.insert((-1,-1),'a'),None);
528 assert_eq!(map.insert((-1,2),'b'),None);
529 assert_eq!(map.insert((1,-1),'c'),None);
530 assert_eq!(map.insert((1,2),'d'),None);
531 assert_eq!(map.len(),4);
532
533 assert_eq!(map.remove(&(-1,-2),0),None);
534 assert_eq!(map.remove(&(-1,3),0),None);
535 assert_eq!(map.remove(&(2,-1),0),None);
536 assert_eq!(map.remove(&(2,1),0),None);
537 assert_eq!(map.len(),4);
538
539 assert_eq!(map.get_key_value(&(-1,-2),1),Some((&(-1,-1),&'a',1)));
540 assert_eq!(map.get_key_value(&(-1,3),1),Some((&(-1,2),&'b',1)));
541 assert_eq!(map.get_key_value(&(2,-1),1),Some((&(1,-1),&'c',1)));
542 assert_eq!(map.get_key_value(&(2,2),1),Some((&(1,2),&'d',1)));
543 }
544
545
546 #[test]
547 fn test_insert_and_close_values() {
548 let mut map = BKTreeMap::<i32, AbsDiff, &'static str>::default();
549 map.insert(10, "ten");
550 map.insert(20, "twenty");
551 map.insert(15, "fifteen");
552
553 let mut results: Vec<(&&str, usize)> = map.close_values(12, 3).collect();
555 results.sort_unstable_by_key(|&(_v, d)| d);
556 assert_eq!(results, vec![(&"ten", 2), (&"fifteen", 3)]);
557 }
558
559 #[test]
560 fn test_closest_sorted_output() {
561 let mut map = BKTreeMap::<i32, AbsDiff, &'static str>::default();
562 for &(k, v) in &[(5, "five"), (2, "two"), (8, "eight"), (6, "six")] {
563 map.insert(k, v);
564 }
565 let close = map.close_sorted(&6, 3);
567 let distances: Vec<usize> = close.iter().map(|&(_k, _v, d)| d).collect();
568 assert_eq!(distances, vec![0, 1, 2]);
569 let keys: Vec<i32> = close.iter().map(|&(k, _v, _d)| *k).collect();
570 assert_eq!(keys, vec![6, 5, 8]);
571 }
572
573 #[test]
574 fn test_iterators_key_map_val() {
575 let mut map = BKTreeMap::<i32, AbsDiff, i32>::default();
576 for i in 1..=5 {
577 map.insert(i, i * 10);
578 }
579
580 let mut keys: Vec<i32> = map.keys().cloned().collect();
582 keys.sort_unstable();
583 assert_eq!(keys, vec![1, 2, 3, 4, 5]);
584
585 let mut vals: Vec<i32> = map.values().cloned().collect();
587 vals.sort_unstable();
588 assert_eq!(vals, vec![10, 20, 30, 40, 50]);
589
590 let mut pairs: Vec<(i32, i32)> = map.iter().map(|(&k, &v)| (k, v)).collect();
592 pairs.sort_unstable();
593 assert_eq!(pairs, vec![(1,10), (2,20), (3,30), (4,40), (5,50)]);
594 }
595
596 #[test]
597 fn test_clear_and_length() {
598 let mut map = BKTreeMap::<i32, AbsDiff, ()>::new(AbsDiff);
599 map.insert(1, ());
600 map.insert(2, ());
601 assert_eq!(map.len(), 2);
602 map.clear();
603 assert_eq!(map.len(), 0);
604 assert_eq!(map.close_keys(1, 1).count(), 0);
606 }
607 #[test]
608 fn test_from_iterator_and_default() {
609 let data = vec![(0, "zero"), (3, "three"), (7, "seven")];
610 let map: BKTreeMap<_, AbsDiff, _> = data.clone().into_iter().collect();
611 let default_map: BKTreeMap<i32, AbsDiff, &str> = BKTreeMap::default();
613 assert_eq!(default_map.len(), 0);
614
615 let mut collected: Vec<(i32, &str)> = map.iter().map(|(&k, &v)| (k, v)).collect();
616 let mut expected = data;
617 collected.sort_unstable();
618 expected.sort_unstable();
619 assert_eq!(collected, expected);
620 }
621 impl DiscreteMetric<(isize,isize),(isize,isize)> for Cheb2D{
622 fn distance(&self,x:&(isize,isize),y:&(isize,isize))->usize{
623 let ((xx,xy),(yx,yy))=(x,y);
624 ((xx-yx).abs() as usize).max((xy-yy).abs() as usize)
625 }
626 }
627 impl DiscreteMetric<i32,i32> for AbsDiff{
628 fn distance(&self,x:&i32,y:&i32)->usize{(*x-*y).abs() as usize}
629 }
630 #[derive(Clone,Copy,Debug,Default)]
631 struct AbsDiff;
633 #[derive(Clone,Copy,Debug,Default)]
634 struct Cheb2D;
636 use super::*;
637}
638#[derive(Clone,Debug)]
639pub struct BKTreeMap<K,M,V>{length:usize,metric:M,root:Option<Node<K,V>>}
641#[derive(Debug)]
642pub struct CloseKeyIter<'a,K,M,Q,V>{inner:CloseMapIter<'a,K,M,Q,V>}
644#[derive(Debug)]
645pub struct CloseMapIter<'a,K,M,Q,V>{key:Q,maxdistance:usize,metric:&'a M,nodes:Vec<&'a Node<K,V>>,remaining:usize}
647#[derive(Debug)]
648pub struct CloseValIter<'a,K,M,Q,V>{inner:CloseMapIter<'a,K,M,Q,V>}
650#[derive(Debug)]
651pub struct IntoKeysIter<K,V>{inner:MapIntoIter<K,V>}
653#[derive(Debug)]
654pub struct IntoValsIter<K,V>{inner:MapIntoIter<K,V>}
656#[derive(Debug)]
657pub struct KeyIter<'a,K,V>{inner:MapIter<'a,K,V>}
659#[derive(Debug)]
660pub struct MapIter<'a,K,V>{nodes:Vec<&'a Node<K,V>>,remaining:usize}
662#[derive(Debug)]
663pub struct MapIntoIter<K,V>{nodes:Vec<Node<K,V>>,remaining:usize}
665#[derive(Debug)]
666pub struct MapIterMut<'a,K,V>{nodes:Vec<&'a mut Node<K,V>>,remaining:usize}
668#[derive(Debug)]
669pub struct ValIter<'a,K,V>{inner:MapIter<'a,K,V>}
671#[derive(Debug)]
672pub struct ValIterMut<'a,K,V>{inner:MapIterMut<'a,K,V>}
674#[derive(Clone,Debug)]
675struct Node<K,V>{connections:BTreeMap<usize,Node<K,V>>,key:K,value:V}
677use {
678 crate::DiscreteMetric,
679 std::{
680 collections::BTreeMap,iter::{Extend,FromIterator},mem::replace,ops::{Index,IndexMut}
681 }
682};