use std::collections::hash_map::IntoIter;
use std::hash::Hash;
use ahash::AHashMap;
use crate::core::types::MsgId;
#[derive(Debug, Default, Clone)]
pub struct DictMap<K: Eq + Hash, V> {
inner: AHashMap<K, V>,
}
impl<K: Eq + Hash, V> DictMap<K, V> {
pub fn new() -> Self {
Self {
inner: AHashMap::new(),
}
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
inner: AHashMap::with_capacity(capacity),
}
}
pub fn insert(&mut self, key: K, value: V) -> Option<V> {
self.inner.insert(key, value)
}
pub fn remove(&mut self, key: &K) -> Option<V> {
self.inner.remove(key)
}
pub fn get(&self, key: &K) -> Option<&V> {
self.inner.get(key)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
self.inner.get_mut(key)
}
pub fn contains_key(&self, key: &K) -> bool {
self.inner.contains_key(key)
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn clear(&mut self) {
self.inner.clear();
}
pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
self.inner.iter()
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = (&K, &mut V)> {
self.inner.iter_mut()
}
pub fn drain(&mut self) -> impl Iterator<Item = (K, V)> + '_ {
self.inner.drain()
}
}
impl<K: Eq + Hash, V> IntoIterator for DictMap<K, V> {
type Item = (K, V);
type IntoIter = IntoIter<K, V>;
fn into_iter(self) -> Self::IntoIter {
self.inner.into_iter()
}
}
pub type MsgIndex<V> = DictMap<MsgId, V>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn insert_get_remove_round_trip() {
let mut m: DictMap<u64, &'static str> = DictMap::new();
assert!(m.is_empty());
m.insert(1, "one");
m.insert(2, "two");
assert_eq!(m.len(), 2);
assert_eq!(m.get(&1), Some(&"one"));
assert!(m.contains_key(&2));
assert_eq!(m.remove(&1), Some("one"));
assert_eq!(m.remove(&1), None);
assert_eq!(m.len(), 1);
m.clear();
assert!(m.is_empty());
}
#[test]
fn msg_index_alias_resolves() {
let mut idx: MsgIndex<u32> = MsgIndex::new();
idx.insert(7, 700);
assert_eq!(idx.get(&7), Some(&700));
}
#[test]
fn iter_visits_every_entry() {
let mut m: DictMap<u32, u32> = DictMap::with_capacity(4);
for i in 0..4 {
m.insert(i, i * i);
}
let mut seen: Vec<(u32, u32)> = m.iter().map(|(k, v)| (*k, *v)).collect();
seen.sort_unstable();
assert_eq!(seen, vec![(0, 0), (1, 1), (2, 4), (3, 9)]);
}
}