64 lines
1.4 KiB
Rust
Raw Normal View History

2021-06-24 23:37:45 +08:00
use std::{
any::{Any, TypeId},
collections::HashMap,
};
2021-07-09 17:47:15 +08:00
#[derive(Default, Debug)]
pub struct ModuleDataMap {
map: HashMap<TypeId, Box<dyn Any + Sync + Send>>,
2021-06-24 23:37:45 +08:00
}
2021-07-09 17:47:15 +08:00
impl ModuleDataMap {
2021-06-24 23:37:45 +08:00
#[inline]
pub fn new() -> ModuleDataMap {
ModuleDataMap {
map: HashMap::default(),
}
}
2021-06-24 23:37:45 +08:00
pub fn insert<T>(&mut self, val: T) -> Option<T>
where
T: 'static + Send + Sync,
{
self.map
.insert(TypeId::of::<T>(), Box::new(val))
.and_then(downcast_owned)
2021-06-24 23:37:45 +08:00
}
2021-06-25 23:53:13 +08:00
pub fn remove<T>(&mut self) -> Option<T>
where
T: 'static + Send + Sync,
{
self.map.remove(&TypeId::of::<T>()).and_then(downcast_owned)
}
2021-06-25 23:53:13 +08:00
pub fn get<T>(&self) -> Option<&T>
where
T: 'static + Send + Sync,
{
2021-09-13 15:51:13 +08:00
self.map.get(&TypeId::of::<T>()).and_then(|boxed| boxed.downcast_ref())
2021-06-25 23:53:13 +08:00
}
pub fn get_mut<T>(&mut self) -> Option<&mut T>
where
T: 'static + Send + Sync,
{
self.map
.get_mut(&TypeId::of::<T>())
.and_then(|boxed| boxed.downcast_mut())
2021-06-25 23:53:13 +08:00
}
pub fn contains<T>(&self) -> bool
where
T: 'static + Send + Sync,
{
self.map.contains_key(&TypeId::of::<T>())
}
2021-06-25 23:53:13 +08:00
2021-07-09 17:47:15 +08:00
pub fn extend(&mut self, other: ModuleDataMap) { self.map.extend(other.map); }
2021-06-24 23:37:45 +08:00
}
fn downcast_owned<T: 'static + Send + Sync>(boxed: Box<dyn Any + Send + Sync>) -> Option<T> {
boxed.downcast().ok().map(|boxed| *boxed)
}