fixed_queue/
linear_map.rs

1//! Map
2
3use crate::vec::Vec;
4use core::borrow::{Borrow, BorrowMut};
5use core::convert::{AsMut, AsRef};
6use core::mem;
7use core::ops;
8
9pub struct LinearMap<K, V, const N: usize> {
10    vec: Vec<(K, V), N>,
11}
12impl<K, V, const N: usize> LinearMap<K, V, N> {
13    const CAPACITY: usize = N;
14    pub const fn new() -> Self {
15        LinearMap { vec: Vec::new() }
16    }
17    pub fn capacity(&self) -> usize {
18        Self::CAPACITY
19    }
20}
21impl<K: PartialEq, V, const N: usize> LinearMap<K, V, N> {
22    fn get_index(&self, key: &K) -> Option<usize> {
23        if let Some((i, _item)) = self.iter().enumerate().find(|(_i, item)| &item.0 == key) {
24            Some(i)
25        } else {
26            None
27        }
28    }
29    pub fn get(&self, key: &K) -> Option<&V> {
30        if let Some(i) = self.get_index(key) {
31            Some(&self[i].1)
32        } else {
33            None
34        }
35    }
36    pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
37        if let Some(i) = self.get_index(key) {
38            Some(&mut self[i].1)
39        } else {
40            None
41        }
42    }
43    pub fn contains_key(&self, key: &K) -> bool {
44        self.iter().any(|x| &x.0 == key)
45    }
46    pub fn insert(&mut self, key: K, value: V) -> Result<Option<V>, (K, V)> {
47        if let Some(i) = self.get_index(&key) {
48            Ok(Some(mem::replace(&mut self[i].1, value)))
49        } else {
50            self.vec.push((key, value))?;
51            Ok(None)
52        }
53    }
54    pub fn remove(&mut self, key: &K) -> Option<V> {
55        if let Some(i) = self.get_index(key) {
56            let rm = self.vec.swap_remove(i);
57            Some(rm.1)
58        } else {
59            None
60        }
61    }
62}
63
64impl<K, V, const N: usize> ops::Deref for LinearMap<K, V, N> {
65    type Target = [(K, V)];
66
67    fn deref(&self) -> &[(K, V)] {
68        self.vec.deref()
69    }
70}
71impl<K, V, const N: usize> ops::DerefMut for LinearMap<K, V, N> {
72    fn deref_mut(&mut self) -> &mut [(K, V)] {
73        self.vec.deref_mut()
74    }
75}
76impl<K, V, const N: usize> AsRef<[(K, V)]> for LinearMap<K, V, N> {
77    fn as_ref(&self) -> &[(K, V)] {
78        self
79    }
80}
81impl<K, V, const N: usize> AsMut<[(K, V)]> for LinearMap<K, V, N> {
82    fn as_mut(&mut self) -> &mut [(K, V)] {
83        self
84    }
85}
86impl<K, V, const N: usize> Borrow<[(K, V)]> for LinearMap<K, V, N> {
87    fn borrow(&self) -> &[(K, V)] {
88        &self[..]
89    }
90}
91impl<K, V, const N: usize> BorrowMut<[(K, V)]> for LinearMap<K, V, N> {
92    fn borrow_mut(&mut self) -> &mut [(K, V)] {
93        &mut self[..]
94    }
95}