Skip to main content

adts/maps/
hashmap.rs

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