mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
egui any maps: add get_or + #[inline]
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user