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

View file

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

View file

@ -17,16 +17,17 @@ impl<Key: Hash + Eq> Default for AnyMap<Key> {
// ----------------------------------------------------------------------------
impl<Key: Hash + Eq> AnyMap<Key> {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&T> {
self.get_mut(key).map(|x| &*x)
}
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self, key: &Key) -> Option<&mut T> {
self.0.get_mut(key)?.get_mut()
}
}
impl<Key: Hash + Eq> AnyMap<Key> {
#[inline]
pub fn get_or_insert_with<T: AnyMapTrait>(
&mut self,
key: Key,
@ -35,10 +36,16 @@ impl<Key: Hash + Eq> AnyMap<Key> {
&*self.get_mut_or_insert_with(key, or_insert_with)
}
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self, key: Key) -> &T {
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>(
&mut self,
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 {
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) {
self.0.insert(key, AnyMapElement::new(element));
}
#[inline]
pub fn remove(&mut self, key: &Key) {
self.0.remove(key);
}
@ -74,12 +81,11 @@ impl<Key: Hash + Eq> AnyMap<Key> {
self.0.retain(|_, v| v.type_id() != key);
}
#[inline]
pub fn clear(&mut self) {
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.
pub fn count<T: AnyMapTrait>(&mut self) -> usize {
let key = TypeId::of::<T>();

View file

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

View file

@ -13,24 +13,31 @@ pub struct TypeMap(HashMap<TypeId, AnyMapElement>);
// ----------------------------------------------------------------------------
impl TypeMap {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> {
self.get_mut().map(|x| &*x)
}
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> {
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 {
&*self.get_mut_or_insert_with(or_insert_with)
}
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T {
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>(
&mut self,
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 {
self.get_mut_or_insert_with(Default::default)
}
}
impl TypeMap {
#[inline]
pub fn insert<T: AnyMapTrait>(&mut self, element: T) {
self.0
.insert(TypeId::of::<T>(), AnyMapElement::new(element));
}
#[inline]
pub fn remove<T: AnyMapTrait>(&mut self) {
self.0.remove(&TypeId::of::<T>());
}
#[inline]
pub fn clear(&mut self) {
self.0.clear();
}

View file

@ -12,24 +12,31 @@ pub struct TypeMap(HashMap<TypeId, AnyMapElement>);
// ----------------------------------------------------------------------------
impl TypeMap {
#[inline]
pub fn get<T: AnyMapTrait>(&mut self) -> Option<&T> {
self.get_mut().map(|x| &*x)
}
#[inline]
pub fn get_mut<T: AnyMapTrait>(&mut self) -> Option<&mut T> {
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 {
&*self.get_mut_or_insert_with(or_insert_with)
}
#[inline]
pub fn get_or_default<T: AnyMapTrait + Default>(&mut self) -> &T {
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>(
&mut self,
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 {
self.get_mut_or_insert_with(Default::default)
}
}
impl TypeMap {
#[inline]
pub fn insert<T: AnyMapTrait>(&mut self, element: T) {
self.0
.insert(TypeId::of::<T>(), AnyMapElement::new(element));
}
#[inline]
pub fn remove<T: AnyMapTrait>(&mut self) {
self.0.remove(&TypeId::of::<T>());
}
#[inline]
pub fn clear(&mut self) {
self.0.clear();
}