NamedAnymap
This commit is contained in:
parent
da1ac0e064
commit
9061e5a3ec
@ -240,3 +240,103 @@ impl MetaInstanceMap {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct NamedAnyMap {
|
||||
map: HashMap<TypeId, HashMap<&'static str, Box<dyn Any>>>,
|
||||
}
|
||||
|
||||
impl NamedAnyMap {
|
||||
pub fn get<T>(&self, name: &'static str) -> Option<&T>
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
match self.map.get(&TypeId::of::<T>()) {
|
||||
None => None,
|
||||
Some(h) => h
|
||||
.get(&name)
|
||||
.map(|x| x.as_ref().downcast_ref::<T>().unwrap()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_mut<T>(&mut self, name: &'static str) -> Option<&mut T>
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
match self.map.get_mut(&TypeId::of::<T>()) {
|
||||
None => None,
|
||||
Some(h) => h
|
||||
.get_mut(&name)
|
||||
.map(|x| x.as_mut().downcast_mut::<T>().unwrap()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_all<T>(
|
||||
&self,
|
||||
) -> Option<core::iter::Map<Values<'_, &'static str, Box<dyn Any>>, fn(&Box<dyn Any>) -> &T>>
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
match self.map.get(&TypeId::of::<T>()) {
|
||||
None => None,
|
||||
Some(h) => Some(h.values().map(|x| x.as_ref().downcast_ref::<T>().unwrap())),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_all_mut<T>(
|
||||
&mut self,
|
||||
) -> Option<
|
||||
core::iter::Map<ValuesMut<'_, &'static str, Box<dyn Any>>, fn(&mut Box<dyn Any>) -> &mut T>,
|
||||
>
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
match self.map.get_mut(&TypeId::of::<T>()) {
|
||||
None => None,
|
||||
Some(h) => Some(
|
||||
h.values_mut()
|
||||
.map(|x| x.as_mut().downcast_mut::<T>().unwrap()),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn insert<T>(&mut self, t: T, name: &'static str)
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
let typeid = TypeId::of::<T>();
|
||||
if !self.map.contains_key(&typeid) {
|
||||
self.map.insert(typeid, HashMap::default());
|
||||
}
|
||||
self.map
|
||||
.get_mut(&typeid)
|
||||
.unwrap()
|
||||
.insert(name, Box::new(t));
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.map.len()
|
||||
}
|
||||
|
||||
pub fn contains_type<T>(&self) -> bool
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
self.map.contains_key(&TypeId::of::<T>())
|
||||
}
|
||||
|
||||
pub fn contains<T>(&self, name: &'static str) -> bool
|
||||
where
|
||||
T: Any,
|
||||
{
|
||||
match self.map.get(&TypeId::of::<T>()) {
|
||||
None => false,
|
||||
Some(h) => h.contains_key(&name),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
map: HashMap::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user