egui any maps: add get_or + #[inline]
This commit is contained in:
parent
863e6cb07d
commit
4c78f61a96
6 changed files with 55 additions and 20 deletions
|
@ -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>();
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue