fixed_queue/
linear_map.rs1use 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}