From eb65a5d29a1c2837cfee86cf92cf43f06bca5f76 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jan 2022 15:41:30 +0100 Subject: [PATCH] Fix `TreeMap::get` always returning `None` --- crates/sum_tree/src/tree_map.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/sum_tree/src/tree_map.rs b/crates/sum_tree/src/tree_map.rs index 76eb78476c..f50c233d05 100644 --- a/crates/sum_tree/src/tree_map.rs +++ b/crates/sum_tree/src/tree_map.rs @@ -23,10 +23,13 @@ pub struct MapKeyRef<'a, K>(Option<&'a K>); impl TreeMap { pub fn get<'a>(&self, key: &'a K) -> Option<&V> { let mut cursor = self.0.cursor::>(); - let key = MapKeyRef(Some(key)); - cursor.seek(&key, Bias::Left, &()); - if key.cmp(cursor.start(), &()) == Ordering::Equal { - Some(&cursor.item().unwrap().value) + cursor.seek(&MapKeyRef(Some(key)), Bias::Left, &()); + if let Some(item) = cursor.item() { + if *key == item.key().0 { + Some(&item.value) + } else { + None + } } else { None } @@ -129,24 +132,32 @@ mod tests { assert_eq!(map.iter().collect::>(), vec![]); map.insert(3, "c"); + assert_eq!(map.get(&3), Some(&"c")); assert_eq!(map.iter().collect::>(), vec![(&3, &"c")]); map.insert(1, "a"); + assert_eq!(map.get(&1), Some(&"a")); assert_eq!(map.iter().collect::>(), vec![(&1, &"a"), (&3, &"c")]); map.insert(2, "b"); + assert_eq!(map.get(&2), Some(&"b")); + assert_eq!(map.get(&1), Some(&"a")); + assert_eq!(map.get(&3), Some(&"c")); assert_eq!( map.iter().collect::>(), vec![(&1, &"a"), (&2, &"b"), (&3, &"c")] ); map.remove(&2); + assert_eq!(map.get(&2), None); assert_eq!(map.iter().collect::>(), vec![(&1, &"a"), (&3, &"c")]); map.remove(&3); + assert_eq!(map.get(&3), None); assert_eq!(map.iter().collect::>(), vec![(&1, &"a")]); map.remove(&1); + assert_eq!(map.get(&1), None); assert_eq!(map.iter().collect::>(), vec![]); } }