create mutable versions of TypeRegistry methods (#4484)

# Objective

It is possible to get a mutable reference to a `TypeRegistration` using
`TypeRegistry::get_mut`. However, none of its other methods
(`get_mut_with_name`, `get_type_data`, `iter`, etc.) have mutable
versions.

Besides improving consistency, this change would facilitate use cases
which involve storing mutable state data in the `TypeRegistry`.

## Solution

Provides a trivial wrapper around the mutable accessors that the
`TypeRegistration` already provides. Exactly mirrors the existing
immutable versions.
This commit is contained in:
oddfacade 2022-05-09 13:37:38 +00:00
parent 96078c76eb
commit a2f966ee9f

View File

@ -104,7 +104,7 @@ impl TypeRegistry {
.and_then(move |id| self.get_mut(id)) .and_then(move |id| self.get_mut(id))
} }
/// Returns a mutable reference to the [`TypeRegistration`] of the type with /// Returns a reference to the [`TypeRegistration`] of the type with
/// the given short name. /// the given short name.
/// ///
/// If the short name is ambiguous, or if no type with the given short name /// If the short name is ambiguous, or if no type with the given short name
@ -115,7 +115,21 @@ impl TypeRegistry {
.and_then(|id| self.registrations.get(id)) .and_then(|id| self.registrations.get(id))
} }
/// Returns the [`TypeData`] of type `T` associated with the given `TypeId`. /// Returns a mutable reference to the [`TypeRegistration`] of the type with
/// the given short name.
///
/// If the short name is ambiguous, or if no type with the given short name
/// has been registered, returns `None`.
pub fn get_with_short_name_mut(
&mut self,
short_type_name: &str,
) -> Option<&mut TypeRegistration> {
self.short_name_to_id
.get(short_type_name)
.and_then(|id| self.registrations.get_mut(id))
}
/// Returns a reference to the [`TypeData`] of type `T` associated with the given `TypeId`.
/// ///
/// The returned value may be used to downcast [`Reflect`] trait objects to /// The returned value may be used to downcast [`Reflect`] trait objects to
/// trait objects of the trait used to generate `T`, provided that the /// trait objects of the trait used to generate `T`, provided that the
@ -129,11 +143,26 @@ impl TypeRegistry {
.and_then(|registration| registration.data::<T>()) .and_then(|registration| registration.data::<T>())
} }
/// Returns an iterator overed the [`TypeRegistration`]s of the registered /// Returns a mutable reference to the [`TypeData`] of type `T` associated with the given `TypeId`.
///
/// If the specified type has not been registered, or if `T` is not present
/// in its type registration, returns `None`.
pub fn get_type_data_mut<T: TypeData>(&mut self, type_id: TypeId) -> Option<&mut T> {
self.get_mut(type_id)
.and_then(|registration| registration.data_mut::<T>())
}
/// Returns an iterator over the [`TypeRegistration`]s of the registered
/// types. /// types.
pub fn iter(&self) -> impl Iterator<Item = &TypeRegistration> { pub fn iter(&self) -> impl Iterator<Item = &TypeRegistration> {
self.registrations.values() self.registrations.values()
} }
/// Returns a mutable iterator over the [`TypeRegistration`]s of the registered
/// types.
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut TypeRegistration> {
self.registrations.values_mut()
}
} }
impl TypeRegistryArc { impl TypeRegistryArc {