1impl<M:?Sized+DiscreteMetric<U,V>,U:?Sized,V:?Sized> DiscreteMetric<U,V> for &M{
2 fn distance(&self,u:&U,v:&V)->usize{(**self).distance(u,v)}
3}
4impl<M:?Sized+DiscreteMetric<U,V>,U:?Sized,V:?Sized> DiscreteMetric<U,V> for &mut M{
5 fn distance(&self,u:&U,v:&V)->usize{(**self).distance(u,v)}
6}
7#[cfg(test)]
8mod tests{
9 #[test]
10 fn ceil_l2_set_radius_2() {
11 let mut tree = BKTreeSet::new(CeilL2::new());
13 tree.insert([0i32, 0]);
14 tree.insert([1, 1]);
15 tree.insert([2, 2]);
16
17 let mut found: Vec<([i32;2], usize)>=tree.close_iter([0, 0], 2).map(|(pt, d)| (*pt, d)).collect();
22 found.sort_unstable();
23 assert_eq!(found, vec![([0, 0], 0), ([1, 1], 2)]);
24 }
25 #[test]
26 fn hamming_set_radius_3() {
27 let mut tree = BKTreeSet::new(Hamming::new_for(StrRef));
29 tree.insert("karolin".to_string());
30 tree.insert("kathrin".to_string());
31 tree.insert("kerstin".to_string());
32
33 let self_only: Vec<(String,usize)>=tree.close_iter("karolin".to_string(), 2).map(|(s, d)| (s.clone(), d)).collect();
37 assert_eq!(self_only, vec![("karolin".to_string(), 0)]);
38
39 let mut radius3: Vec<(String, usize)>=tree.close_iter("karolin".to_string(),3).map(|(s, d)| (s.clone(), d)).collect();
41 radius3.sort_unstable();
42 assert_eq!(radius3, vec![("karolin".to_string(),0),("kathrin".to_string(),3),("kerstin".to_string(),3)]);
43 }
44 #[test]
45 fn levenshtein_set_various() {
46 let mut tree = BKTreeSet::new(Levenshtein::new());
48 tree.insert("kitten".to_string());
49 tree.insert("sitting".to_string());
50 tree.insert("bitten".to_string());
51 tree.insert("mitten".to_string());
52
53 let mut results: Vec<(String, usize)>=tree.close_iter("kitten".to_string(), 1).map(|(s, d)| (s.clone(), d)).collect();
58 results.sort_unstable();
59 assert_eq!(results,vec![("bitten".to_string(), 1), ("kitten".to_string(), 0),("mitten".to_string(),1)]);
60
61 let mut radius3: Vec<(String, usize)>=tree.close_iter("kitten".to_string(), 3).map(|(s, d)| (s.clone(), d)).collect();
63 radius3.sort_unstable();
64 assert_eq!(radius3, vec![("bitten".to_string(), 1),("kitten".to_string(), 0), ("mitten".to_string(), 1),("sitting".to_string(), 3)]);
65 }
66 use crate::{
67 metrics::{CeilL2,Hamming,Levenshtein,StrRef},set::BKTreeSet
68 };
69}
70pub mod map;
72pub mod metrics;
74pub mod set;
76pub trait DiscreteMetric<U:?Sized,V:?Sized>{
78 fn distance(&self,u:&U,v:&V)->usize;
80}
81pub use {map::BKTreeMap,set::BKTreeSet};