use std::collections::HashMap;
use crate::format::KeydirEntry;
pub trait Keydir {
fn get(&self, k: impl AsRef<[u8]>) -> Option<&KeydirEntry>;
fn put(&mut self, k: Vec<u8>, v: KeydirEntry) -> Option<KeydirEntry>;
fn remove(&mut self, k: impl AsRef<[u8]>);
fn iter(&self) -> impl Iterator<Item = (impl AsRef<[u8]>, &KeydirEntry)>;
}
pub trait KeydirDefault: Default {}
#[derive(Default, Debug)]
pub struct HashmapKeydir {
mapping: HashMap<Vec<u8>, KeydirEntry>,
}
impl Keydir for HashmapKeydir {
fn get(&self, key: impl AsRef<[u8]>) -> Option<&KeydirEntry> {
self.mapping.get(key.as_ref())
}
fn put(&mut self, k: Vec<u8>, v: KeydirEntry) -> Option<KeydirEntry> {
self.mapping.insert(k, v)
}
fn remove(&mut self, k: impl AsRef<[u8]>) {
self.mapping.remove(k.as_ref());
}
fn iter(&self) -> impl Iterator<Item = (impl AsRef<[u8]>, &KeydirEntry)> {
self.mapping.iter()
}
}
impl KeydirDefault for HashmapKeydir {}
#[cfg(test)]
mod tests {
use super::*;
fn test_keydir(mut keydir: impl Keydir) {
assert_eq!(keydir.get(b"hello"), None);
let entry = KeydirEntry::new(0, 1, 2, 3);
keydir.put(b"hello".to_vec(), entry.clone());
assert_eq!(keydir.get(b"hello"), Some(&entry));
}
#[test]
fn hashmap_keydir_should_implement_keydir() {
test_keydir(HashmapKeydir::default());
}
}