1use alloc::vec::Vec;
2use core::mem;
3use core::ops::Index;
4
5#[derive(Debug)]
17pub struct LinearMap<K, V>(
18 Vec<(K, V)>,
20);
21
22impl<K, V> Default for LinearMap<K, V> {
23 fn default() -> Self {
24 Self(Default::default())
25 }
26}
27
28impl<K: Eq, V> LinearMap<K, V> {
29 pub fn new() -> Self {
31 Default::default()
32 }
33
34 pub fn with_capacity(capacity: usize) -> Self {
36 Self(Vec::with_capacity(capacity))
37 }
38
39 pub fn get(&self, k: &K) -> Option<&V> {
45 self.0.iter().find(|(kk, _)| kk == k).map(|(_, v)| v)
46 }
47
48 pub fn get_mut(&mut self, k: &K) -> Option<&mut V> {
54 self.0.iter_mut().find(|(kk, _)| kk == k).map(|(_, v)| v)
55 }
56
57 pub fn insert(&mut self, k: K, mut v: V) -> Option<V> {
64 if let Some(vv) = self.get_mut(&k) {
65 mem::swap(&mut v, vv);
66 Some(v)
67 } else {
68 self.0.push((k, v));
69 None
70 }
71 }
72
73 pub fn get_or_insert_with(&mut self, k: K, f: impl FnOnce() -> V) -> &mut V {
80 let existing = self.0.iter().position(|(kk, _)| kk == &k);
81 if let Some(idx) = existing {
82 &mut self.0[idx].1
83 } else {
84 self.0.push((k, f()));
85 let slot = self.0.last_mut().unwrap();
86 &mut slot.1
87 }
88 }
89
90 pub fn values(&self) -> impl Iterator<Item = &V> {
94 self.0.iter().map(|(_, v)| v)
95 }
96
97 pub fn keys(&self) -> impl Iterator<Item = &K> {
101 self.0.iter().map(|(k, _)| k)
102 }
103
104 pub fn iter(&self) -> impl Iterator<Item = &(K, V)> {
108 self.0.iter()
109 }
110}
111
112impl<K: Eq, V> FromIterator<(K, V)> for LinearMap<K, V> {
113 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
119 let mut me = Self::default();
120 for (k, v) in iter {
121 me.insert(k, v);
122 }
123 me
124 }
125}
126
127impl<K, V> IntoIterator for LinearMap<K, V> {
128 type Item = (K, V);
129 type IntoIter = <Vec<(K, V)> as IntoIterator>::IntoIter;
130
131 fn into_iter(self) -> Self::IntoIter {
132 self.0.into_iter()
133 }
134}
135
136impl<K: Eq, V> Index<&K> for LinearMap<K, V> {
137 type Output = V;
138
139 fn index(&self, index: &K) -> &Self::Output {
140 self.get(index).unwrap()
141 }
142}
143
144impl<'a, K, V> IntoIterator for &'a LinearMap<K, V> {
145 type Item = &'a (K, V);
146 type IntoIter = <&'a Vec<(K, V)> as IntoIterator>::IntoIter;
147
148 fn into_iter(self) -> Self::IntoIter {
149 self.0.iter()
150 }
151}
152
153#[cfg(test)]
154mod tests {
155 use alloc::vec;
156
157 use super::*;
158
159 #[test]
160 fn test_insert_and_get() {
161 let mut map = LinearMap::new();
162
163 assert_eq!(map.insert(1, "a"), None);
165
166 assert_eq!(map.get(&1), Some(&"a"));
168
169 assert_eq!(map.insert(1, "b"), Some("a"));
171
172 assert_eq!(map.get(&1), Some(&"b"));
174
175 assert_eq!(map.get(&2), None);
177 }
178
179 #[test]
180 fn test_get_mut() {
181 let mut map = LinearMap::new();
182 map.insert(42, 100);
183
184 if let Some(val) = map.get_mut(&42) {
186 *val += 1;
187 }
188
189 assert_eq!(map.get(&42), Some(&101));
191
192 assert_eq!(map.get_mut(&999), None);
194 }
195
196 #[test]
197 fn test_get_or_insert_with() {
198 let mut map = LinearMap::new();
199
200 let val = map.get_or_insert_with(10, || 123);
202 assert_eq!(*val, 123);
203
204 let val2 = map.get_or_insert_with(10, || panic!("should not be called"));
206 assert_eq!(*val2, 123);
207
208 let val3 = map.get_or_insert_with(20, || 777);
210 assert_eq!(*val3, 777);
211 }
212
213 #[test]
214 fn test_values_iterator() {
215 let mut map = LinearMap::new();
216 map.insert("a", 1);
217 map.insert("b", 2);
218 map.insert("c", 3);
219
220 let values: Vec<_> = map.values().copied().collect();
222 assert_eq!(values, vec![1, 2, 3]);
223 }
224
225 #[test]
226 fn test_keys_iterator() {
227 let mut map = LinearMap::new();
228 map.insert("a", 1);
229 map.insert("b", 2);
230 map.insert("c", 3);
231
232 let values: Vec<_> = map.keys().copied().collect();
234 assert_eq!(values, vec!["a", "b", "c"]);
235 }
236
237 #[test]
238 fn test_index() {
239 let mut map = LinearMap::new();
240 map.insert("a", 1);
241 map.insert("b", 2);
242 map.insert("c", 3);
243
244 assert_eq!(map[&"a"], 1);
245 assert_eq!(map[&"b"], 2);
246 assert_eq!(map[&"c"], 3);
247 }
248
249 #[test]
250 fn test_from_iterator_behavior() {
251 let map: LinearMap<_, _> = vec![(1, "a"), (2, "b"), (1, "c")].into_iter().collect();
253
254 assert_eq!(map.get(&1), Some(&"c"));
256 assert_eq!(map.get(&2), Some(&"b"));
257 }
258
259 #[test]
260 fn test_into_iterator() {
261 let mut map = LinearMap::new();
262 map.insert("x", 10);
263 map.insert("z", 30);
264 map.insert("y", 20);
265
266 let iter_ref = map.iter().copied().collect::<Vec<_>>();
268 let iter = map.into_iter().collect::<Vec<_>>();
270
271 assert_eq!(iter_ref, vec![("x", 10), ("z", 30), ("y", 20)]);
273 assert_eq!(iter, iter_ref);
275 }
276
277 #[test]
278 fn test_empty_map_behavior() {
279 let map: LinearMap<i32, &str> = LinearMap::new();
280
281 assert_eq!(map.get(&0), None);
283 assert_eq!(map.get(&999), None);
284
285 assert_eq!(map.values().count(), 0);
287 }
288}