made no_alloc map (untested)
This commit is contained in:
parent
a8973025d5
commit
6aca7422eb
1 changed files with 58 additions and 0 deletions
58
outside/src/arraymap.rs
Normal file
58
outside/src/arraymap.rs
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/// no_std, no_alloc map
|
||||||
|
pub struct ArrayMap<const N: usize, K,V> {
|
||||||
|
keys: [Option<K>; N],
|
||||||
|
values: [Option<V>; N],
|
||||||
|
index: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<const N: usize, K, V> ArrayMap<N, K, V> where K: Eq {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { keys: [const { None };N], values: [const { None };N], index: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert(&mut self, key: K, value: V) {
|
||||||
|
match self.keys[..self.index].iter().enumerate()
|
||||||
|
.find(|k| k.1.as_ref().is_some_and(|v| *v == key)) {
|
||||||
|
Some((index, _)) => {
|
||||||
|
self.keys[index] = Some(key);
|
||||||
|
self.values[index] = Some(value);
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
self.keys[self.index] = Some(key);
|
||||||
|
self.values[self.index] = Some(value);
|
||||||
|
self.index += 1;
|
||||||
|
if self.index > N {
|
||||||
|
self.index = 0;
|
||||||
|
log::error!("arraymap is full, overwriting");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, key: K) -> Option<&V> {
|
||||||
|
match self.keys[..self.index].iter().enumerate()
|
||||||
|
.find(|k| k.1.as_ref().is_some_and(|v| *v == key)) {
|
||||||
|
Some((index, _)) => {
|
||||||
|
self.values[index].as_ref()
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::ArrayMap;
|
||||||
|
|
||||||
|
fn get() {
|
||||||
|
let mut map: ArrayMap<2, i32, &str> = ArrayMap::new();
|
||||||
|
|
||||||
|
map.insert(3, "fogey");
|
||||||
|
map.insert(4, "bogey");
|
||||||
|
|
||||||
|
assert_eq!(map.get(3), Some(&"fogey"));
|
||||||
|
assert_eq!(map.get(5), None);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue