egui any maps: add get_or + #[inline]

This commit is contained in:
Emil Ernerfeldt 2021-10-01 21:08:17 +02:00
parent 863e6cb07d
commit 4c78f61a96
6 changed files with 55 additions and 20 deletions

View file

@ -16,16 +16,17 @@ impl<Key: Hash + Eq> Default for AnyMap<Key> {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
impl<Key: Hash + Eq> AnyMap<Key> { impl<Key: Hash + Eq> AnyMap<Key> {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&T> { pub fn get<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&T> {
self.get_mut(key).map(|x| &*x) self.get_mut(key).map(|x| &*x)
} }
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&mut T> { pub fn get_mut<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&mut T> {
self.0.get_mut(key)?.get_mut() self.0.get_mut(key)?.get_mut()
} }
}
impl<Key: Hash + Eq> AnyMap<Key> { #[inline]
pub fn get_or_insert_with<T: AnyMapTrait>( pub fn get_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
key: Key, key: Key,
@ -34,10 +35,16 @@ impl<Key: Hash + Eq> AnyMap<Key> {
&*self.get_mut_or_insert_with(key, or_insert_with) &*self.get_mut_or_insert_with(key, or_insert_with)
} }
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &T { pub fn get_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &T {
self.get_or_insert_with(key, Default::default) self.get_or_insert_with(key, Default::default)
} }
#[inline]
pub fn get_or<T: AnyMapTrait>(&mut self, key: Key, value: T) -> &T {
&*self.get_mut_or_insert_with(key, || value)
}
pub fn get_mut_or_insert_with<T: AnyMapTrait>( pub fn get_mut_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
key: Key, key: Key,
@ -53,31 +60,32 @@ impl<Key: Hash + Eq> AnyMap<Key> {
} }
} }
#[inline]
pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &mut T { pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &mut T {
self.get_mut_or_insert_with(key, Default::default) self.get_mut_or_insert_with(key, Default::default)
} }
}
impl<Key: Hash + Eq> AnyMap<Key> { #[inline]
pub fn insert<T: AnyMapTrait>(&mut self, key: Key, element: T) { pub fn insert<T: AnyMapTrait>(&mut self, key: Key, element: T) {
self.0.insert(key, AnyMapElement::new(element)); self.0.insert(key, AnyMapElement::new(element));
} }
#[inline]
pub fn remove(&mut self, key: &Key) { pub fn remove(&mut self, key: &Key) {
self.0.remove(key); self.0.remove(key);
} }
#[inline]
pub fn remove_by_type<T: AnyMapTrait>(&mut self) { pub fn remove_by_type<T: AnyMapTrait>(&mut self) {
let key = TypeId::of::<T>(); let key = TypeId::of::<T>();
self.0.retain(|_, v| v.type_id() != key); self.0.retain(|_, v| v.type_id() != key);
} }
#[inline]
pub fn clear(&mut self) { pub fn clear(&mut self) {
self.0.clear(); self.0.clear();
} }
}
impl<Key: Hash + Eq> AnyMap<Key> {
/// You could use this function to find is there some leak or misusage. /// You could use this function to find is there some leak or misusage.
pub fn count<T: AnyMapTrait>(&mut self) -> usize { pub fn count<T: AnyMapTrait>(&mut self) -> usize {
let key = TypeId::of::<T>(); let key = TypeId::of::<T>();

View file

@ -39,10 +39,12 @@ impl AnyMapElement {
} }
} }
#[inline]
pub(crate) fn type_id(&self) -> TypeId { pub(crate) fn type_id(&self) -> TypeId {
(*self.value).type_id() (*self.value).type_id()
} }
#[inline]
pub(crate) fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> { pub(crate) fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> {
self.value.downcast_mut() self.value.downcast_mut()
} }

View file

@ -17,16 +17,17 @@ impl<Key: Hash + Eq> Default for AnyMap<Key> {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
impl<Key: Hash + Eq> AnyMap<Key> { impl<Key: Hash + Eq> AnyMap<Key> {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&T> { pub fn get<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&T> {
self.get_mut(key).map(|x| &*x) self.get_mut(key).map(|x| &*x)
} }
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&mut T> { pub fn get_mut<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&mut T> {
self.0.get_mut(key)?.get_mut() self.0.get_mut(key)?.get_mut()
} }
}
impl<Key: Hash + Eq> AnyMap<Key> { #[inline]
pub fn get_or_insert_with<T: AnyMapTrait>( pub fn get_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
key: Key, key: Key,
@ -35,10 +36,16 @@ impl<Key: Hash + Eq> AnyMap<Key> {
&*self.get_mut_or_insert_with(key, or_insert_with) &*self.get_mut_or_insert_with(key, or_insert_with)
} }
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &T { pub fn get_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &T {
self.get_or_insert_with(key, Default::default) self.get_or_insert_with(key, Default::default)
} }
#[inline]
pub fn get_or<T: AnyMapTrait>(&mut self, key: Key, value: T) -> &T {
&*self.get_mut_or_insert_with(key, || value)
}
pub fn get_mut_or_insert_with<T: AnyMapTrait>( pub fn get_mut_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
key: Key, key: Key,
@ -57,13 +64,13 @@ impl<Key: Hash + Eq> AnyMap<Key> {
pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &mut T { pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &mut T {
self.get_mut_or_insert_with(key, Default::default) self.get_mut_or_insert_with(key, Default::default)
} }
}
impl<Key: Hash + Eq> AnyMap<Key> { #[inline]
pub fn insert<T: AnyMapTrait>(&mut self, key: Key, element: T) { pub fn insert<T: AnyMapTrait>(&mut self, key: Key, element: T) {
self.0.insert(key, AnyMapElement::new(element)); self.0.insert(key, AnyMapElement::new(element));
} }
#[inline]
pub fn remove(&mut self, key: &Key) { pub fn remove(&mut self, key: &Key) {
self.0.remove(key); self.0.remove(key);
} }
@ -74,12 +81,11 @@ impl<Key: Hash + Eq> AnyMap<Key> {
self.0.retain(|_, v| v.type_id() != key); self.0.retain(|_, v| v.type_id() != key);
} }
#[inline]
pub fn clear(&mut self) { pub fn clear(&mut self) {
self.0.clear(); self.0.clear();
} }
}
impl<Key: Hash + Eq> AnyMap<Key> {
/// You could use this function to find is there some leak or misusage. Note, that result of this function could break between runs, if you upgraded the Rust version or for other reasons. /// You could use this function to find is there some leak or misusage. Note, that result of this function could break between runs, if you upgraded the Rust version or for other reasons.
pub fn count<T: AnyMapTrait>(&mut self) -> usize { pub fn count<T: AnyMapTrait>(&mut self) -> usize {
let key = TypeId::of::<T>(); let key = TypeId::of::<T>();

View file

@ -6,12 +6,14 @@ use std::any::Any;
pub struct TypeId(u64); pub struct TypeId(u64);
impl TypeId { impl TypeId {
#[inline]
pub fn of<T: Any + 'static>() -> Self { pub fn of<T: Any + 'static>() -> Self {
std::any::TypeId::of::<T>().into() std::any::TypeId::of::<T>().into()
} }
} }
impl From<std::any::TypeId> for TypeId { impl From<std::any::TypeId> for TypeId {
#[inline]
fn from(id: std::any::TypeId) -> Self { fn from(id: std::any::TypeId) -> Self {
Self(epaint::util::hash(id)) Self(epaint::util::hash(id))
} }

View file

@ -13,24 +13,31 @@ pub struct TypeMap(HashMap<TypeId, AnyMapElement>);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
impl TypeMap { impl TypeMap {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> { pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> {
self.get_mut().map(|x| &*x) self.get_mut().map(|x| &*x)
} }
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> { pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> {
self.0.get_mut(&TypeId::of::<T>())?.get_mut() self.0.get_mut(&TypeId::of::<T>())?.get_mut()
} }
}
impl TypeMap { #[inline]
pub fn get_or_insert_with<T: AnyMapTrait>(&mut self, or_insert_with: impl FnOnce() -> T) -> &T { pub fn get_or_insert_with<T: AnyMapTrait>(&mut self, or_insert_with: impl FnOnce() -> T) -> &T {
&*self.get_mut_or_insert_with(or_insert_with) &*self.get_mut_or_insert_with(or_insert_with)
} }
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T { pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T {
self.get_or_insert_with(Default::default) self.get_or_insert_with(Default::default)
} }
#[inline]
pub fn get_or<T: AnyMapTrait>(&mut self, value: T) -> &T {
&*self.get_mut_or_insert_with(|| value)
}
pub fn get_mut_or_insert_with<T: AnyMapTrait>( pub fn get_mut_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
or_insert_with: impl FnOnce() -> T, or_insert_with: impl FnOnce() -> T,
@ -48,18 +55,19 @@ impl TypeMap {
pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self) -> &mut T { pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self) -> &mut T {
self.get_mut_or_insert_with(Default::default) self.get_mut_or_insert_with(Default::default)
} }
}
impl TypeMap { #[inline]
pub fn insert<T: AnyMapTrait>(&mut self, element: T) { pub fn insert<T: AnyMapTrait>(&mut self, element: T) {
self.0 self.0
.insert(TypeId::of::<T>(), AnyMapElement::new(element)); .insert(TypeId::of::<T>(), AnyMapElement::new(element));
} }
#[inline]
pub fn remove<T: AnyMapTrait>(&mut self) { pub fn remove<T: AnyMapTrait>(&mut self) {
self.0.remove(&TypeId::of::<T>()); self.0.remove(&TypeId::of::<T>());
} }
#[inline]
pub fn clear(&mut self) { pub fn clear(&mut self) {
self.0.clear(); self.0.clear();
} }

View file

@ -12,24 +12,31 @@ pub struct TypeMap(HashMap<TypeId, AnyMapElement>);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
impl TypeMap { impl TypeMap {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> { pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> {
self.get_mut().map(|x| &*x) self.get_mut().map(|x| &*x)
} }
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> { pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> {
self.0.get_mut(&TypeId::of::<T>())?.get_mut() self.0.get_mut(&TypeId::of::<T>())?.get_mut()
} }
}
impl TypeMap { #[inline]
pub fn get_or_insert_with<T: AnyMapTrait>(&mut self, or_insert_with: impl FnOnce() -> T) -> &T { pub fn get_or_insert_with<T: AnyMapTrait>(&mut self, or_insert_with: impl FnOnce() -> T) -> &T {
&*self.get_mut_or_insert_with(or_insert_with) &*self.get_mut_or_insert_with(or_insert_with)
} }
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T { pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T {
self.get_or_insert_with(Default::default) self.get_or_insert_with(Default::default)
} }
#[inline]
pub fn get_or<T: AnyMapTrait>(&mut self, value: T) -> &T {
&*self.get_mut_or_insert_with(|| value)
}
pub fn get_mut_or_insert_with<T: AnyMapTrait>( pub fn get_mut_or_insert_with<T: AnyMapTrait>(
&mut self, &mut self,
or_insert_with: impl FnOnce() -> T, or_insert_with: impl FnOnce() -> T,
@ -44,21 +51,23 @@ impl TypeMap {
} }
} }
#[inline]
pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self) -> &mut T { pub fn get_mut_or_default<T: AnyMapTrait + Default>(&mut self) -> &mut T {
self.get_mut_or_insert_with(Default::default) self.get_mut_or_insert_with(Default::default)
} }
}
impl TypeMap { #[inline]
pub fn insert<T: AnyMapTrait>(&mut self, element: T) { pub fn insert<T: AnyMapTrait>(&mut self, element: T) {
self.0 self.0
.insert(TypeId::of::<T>(), AnyMapElement::new(element)); .insert(TypeId::of::<T>(), AnyMapElement::new(element));
} }
#[inline]
pub fn remove<T: AnyMapTrait>(&mut self) { pub fn remove<T: AnyMapTrait>(&mut self) {
self.0.remove(&TypeId::of::<T>()); self.0.remove(&TypeId::of::<T>());
} }
#[inline]
pub fn clear(&mut self) { pub fn clear(&mut self) {
self.0.clear(); self.0.clear();
} }