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 #[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 #[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}