Skip to main content

adts/maps/
btreemap.rs

1use crate::{Clear, Len, Map, MapGet, MapInsert, MapMut, Retain};
2use alloc::collections::BTreeMap;
3use core::borrow::Borrow;
4
5impl<K: Ord, V> Len for BTreeMap<K, V> {
6    #[inline]
7    fn len(&self) -> usize {
8        self.len()
9    }
10
11    #[inline]
12    fn is_empty(&self) -> bool {
13        self.is_empty()
14    }
15}
16
17impl<K: Ord, V> Clear for BTreeMap<K, V> {
18    #[inline]
19    fn clear(&mut self) {
20        self.clear();
21    }
22}
23
24impl<K, V> Map for BTreeMap<K, V> {
25    type Key = K;
26    type Value = V;
27}
28
29impl<B: ?Sized + Ord, K: Borrow<B> + Ord, V> MapGet<B> for BTreeMap<K, V> {
30    #[inline]
31    fn get(&self, key: &B) -> Option<&Self::Value> {
32        self.get(key)
33    }
34
35    #[inline]
36    fn contains_key(&self, key: &B) -> bool {
37        self.contains_key(key)
38    }
39}
40
41impl<B: ?Sized + Ord, K: Borrow<B> + Ord, V> MapMut<B> for BTreeMap<K, V> {
42    #[inline]
43    fn get_mut(&mut self, key: &B) -> Option<&mut Self::Value> {
44        self.get_mut(key)
45    }
46
47    #[inline]
48    fn remove(&mut self, key: &B) -> Option<Self::Value> {
49        self.remove(key)
50    }
51}
52
53impl<K: Ord, V> MapInsert for BTreeMap<K, V> {
54    #[inline]
55    fn insert(&mut self, key: Self::Key, value: Self::Value) -> Option<Self::Value> {
56        self.insert(key, value)
57    }
58}
59
60impl<K: Ord, V> Retain for BTreeMap<K, V> {
61    type Key = K;
62    type Value = V;
63
64    #[inline]
65    fn retain(&mut self, f: impl FnMut(&Self::Key, &mut Self::Value) -> bool) {
66        self.retain(f);
67    }
68}
69
70#[cfg(test)]
71mod tests {
72    use crate::{Clear, Len, MapGet, MapInsert, MapMut, Retain};
73    use alloc::{collections::BTreeMap, format, string::String};
74
75    fn create_map() -> BTreeMap<String, u32> {
76        let mut map = BTreeMap::new();
77        for i in 0..10 {
78            map.insert(format!("{i}"), i);
79        }
80        map
81    }
82
83    #[test]
84    fn test_clear_len() {
85        let mut map = create_map();
86        assert_eq!(Len::len(&map), 10);
87        Clear::clear(&mut map);
88        assert!(Len::is_empty(&map));
89    }
90
91    #[test]
92    fn test_map_get() {
93        let map = create_map();
94        assert!(MapGet::contains_key(&map, "0"));
95        assert_eq!(MapGet::get(&map, "1"), Some(&1));
96        assert_eq!(MapGet::get(&map, "11"), None);
97    }
98
99    #[test]
100    fn test_map_mut() {
101        let mut map = create_map();
102
103        let new_value = 123;
104        *MapMut::get_mut(&mut map, "1").unwrap() = new_value;
105        assert_eq!(map["1"], new_value);
106
107        assert_eq!(MapMut::remove(&mut map, "1"), Some(new_value));
108        assert_eq!(MapGet::get(&map, "1"), None);
109    }
110
111    #[test]
112    fn test_map_insert() {
113        let mut map = create_map();
114
115        let new_value = 123;
116        assert_eq!(MapInsert::insert(&mut map, "1".into(), new_value), Some(1));
117        assert_eq!(map["1"], new_value);
118
119        assert_eq!(MapInsert::insert(&mut map, "999".into(), new_value), None);
120        assert_eq!(map["999"], new_value);
121    }
122
123    #[test]
124    fn test_retain() {
125        let mut map = create_map();
126
127        Retain::retain(&mut map, |_, val| {
128            if *val == 1 {
129                *val = 3;
130                true
131            } else {
132                false
133            }
134        });
135        assert_eq!(map.len(), 1);
136        assert_eq!(map["1"], 3);
137    }
138}