Skip to main content

adts/maps/
vec.rs

1use crate::{Clear, Len, Map, MapGet, MapInsert, MapMut, Pop, Push, Retain};
2use alloc::vec::Vec;
3use core::mem::replace;
4
5impl<T> Len for Vec<T> {
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<T> Clear for Vec<T> {
18    #[inline]
19    fn clear(&mut self) {
20        self.clear();
21    }
22}
23
24impl<T> Push for Vec<T> {
25    type Index = usize;
26    type Value = T;
27
28    #[inline]
29    fn push(&mut self, value: Self::Value) -> Self::Index {
30        self.push(value);
31        self.len() - 1
32    }
33}
34
35impl<T> Pop for Vec<T> {
36    type Value = T;
37
38    #[inline]
39    fn pop(&mut self) -> Option<Self::Value> {
40        self.pop()
41    }
42}
43
44impl<T> Map for Vec<T> {
45    type Key = usize;
46    type Value = T;
47}
48
49impl<T> MapGet<usize> for Vec<T> {
50    #[inline]
51    fn get(&self, key: &usize) -> Option<&Self::Value> {
52        self.as_slice().get(*key)
53    }
54
55    #[inline]
56    fn contains_key(&self, key: &usize) -> bool {
57        self.len() > *key
58    }
59}
60
61impl<T> MapMut<usize> for Vec<T> {
62    #[inline]
63    fn get_mut(&mut self, key: &usize) -> Option<&mut Self::Value> {
64        self.as_mut_slice().get_mut(*key)
65    }
66
67    /// Removes and returns the element at given index, shifting all elements after it to the left.
68    #[inline]
69    fn remove(&mut self, key: &usize) -> Option<Self::Value> {
70        if self.contains_key(key) {
71            Some(self.remove(*key))
72        } else {
73            None
74        }
75    }
76}
77
78impl<T: Default> MapInsert for Vec<T> {
79    /// Replaces an element at given index.
80    #[inline]
81    fn insert(&mut self, key: Self::Key, value: Self::Value) -> Option<Self::Value> {
82        if self.len() > key {
83            Some(replace(&mut self[key], value))
84        } else {
85            None
86        }
87    }
88}
89
90impl<T> Retain for Vec<T> {
91    type Key = usize;
92    type Value = T;
93
94    #[inline]
95    fn retain(&mut self, mut f: impl FnMut(&Self::Key, &mut Self::Value) -> bool) {
96        let mut i: usize = 0;
97        self.retain_mut(|value| {
98            let result = f(&i, value);
99            i += 1;
100            result
101        });
102    }
103}
104
105#[cfg(test)]
106mod tests {
107    use crate::{Clear, Len, MapGet, MapInsert, MapMut, Pop, Push, Retain};
108    use alloc::vec;
109
110    #[test]
111    fn test_clear_len() {
112        let mut vec = vec![0, 1, 2];
113        assert_eq!(Len::len(&vec), 3);
114        Clear::clear(&mut vec);
115        assert!(Len::is_empty(&vec));
116    }
117
118    #[test]
119    fn test_map_get() {
120        let vec = vec![0, 1, 2];
121        assert!(MapGet::contains_key(&vec, &0));
122        assert_eq!(MapGet::get(&vec, &1), Some(&1));
123        assert_eq!(MapGet::get(&vec, &3), None);
124    }
125
126    #[test]
127    fn test_push() {
128        let mut vec = vec![0, 1, 2];
129        assert_eq!(Push::push(&mut vec, 3), 3);
130        assert_eq!(vec, vec![0, 1, 2, 3]);
131    }
132
133    #[test]
134    fn test_pop() {
135        let mut vec = vec![0, 1, 2];
136        assert_eq!(Pop::pop(&mut vec), Some(2));
137        assert_eq!(vec, vec![0, 1]);
138    }
139
140    #[test]
141    fn test_map_mut() {
142        let mut vec = vec![0, 1, 2];
143
144        let new_value = 123;
145        *MapMut::get_mut(&mut vec, &1).unwrap() = new_value;
146        assert_eq!(vec, vec![0, new_value, 2]);
147
148        assert_eq!(MapMut::remove(&mut vec, &1), Some(new_value));
149        assert_eq!(vec, vec![0, 2]);
150    }
151
152    #[test]
153    fn test_map_insert() {
154        let mut vec = vec![0, 1, 2];
155
156        let new_value = 123;
157        assert_eq!(MapInsert::insert(&mut vec, 1, new_value), Some(1));
158        assert_eq!(vec, vec![0, new_value, 2]);
159
160        assert_eq!(MapInsert::insert(&mut vec, 999, new_value), None);
161        assert_eq!(vec, vec![0, new_value, 2]);
162    }
163
164    #[test]
165    fn test_retain() {
166        let mut vec = vec![0, 1, 2];
167
168        Retain::retain(&mut vec, |_, val| {
169            if *val == 1 {
170                *val = 3;
171                true
172            } else {
173                false
174            }
175        });
176        assert_eq!(vec, vec![3]);
177    }
178}