Struct bevy_reflect::utility::GenericTypeCell
source · pub struct GenericTypeCell<T: TypedProperty>(/* private fields */);
Expand description
A container for TypedProperty
over generic types, allowing instances to be stored statically.
This is specifically meant for use with generic types. If your type isn’t generic,
then use NonGenericTypeCell
instead as it should be much more performant.
#[derive(TypePath)]
and impl_type_path
should always be used over GenericTypePathCell
where possible.
Examples
Implementing TypeInfo
with generics.
use bevy_reflect::utility::GenericTypeInfoCell;
struct Foo<T>(T);
impl<T: Reflect + TypePath> Typed for Foo<T> {
fn type_info() -> &'static TypeInfo {
static CELL: GenericTypeInfoCell = GenericTypeInfoCell::new();
CELL.get_or_insert::<Self, _>(|| {
let fields = [UnnamedField::new::<T>(0)];
let info = TupleStructInfo::new::<Self>(&fields);
TypeInfo::TupleStruct(info)
})
}
}
Implementing TypePath
with generics.
use bevy_reflect::utility::GenericTypePathCell;
struct Foo<T>(T);
impl<T: TypePath> TypePath for Foo<T> {
fn type_path() -> &'static str {
static CELL: GenericTypePathCell = GenericTypePathCell::new();
CELL.get_or_insert::<Self, _>(|| format!("my_crate::foo::Foo<{}>", T::type_path()))
}
fn short_type_path() -> &'static str {
static CELL: GenericTypePathCell = GenericTypePathCell::new();
CELL.get_or_insert::<Self, _>(|| format!("Foo<{}>", T::short_type_path()))
}
fn type_ident() -> Option<&'static str> {
Some("Foo")
}
fn module_path() -> Option<&'static str> {
Some("my_crate::foo")
}
fn crate_name() -> Option<&'static str> {
Some("my_crate")
}
}
Implementations§
source§impl<T: TypedProperty> GenericTypeCell<T>
impl<T: TypedProperty> GenericTypeCell<T>
sourcepub const fn new() -> Self
pub const fn new() -> Self
Initialize a GenericTypeCell
for generic types.
sourcepub fn get_or_insert<G, F>(&self, f: F) -> &T::Stored
pub fn get_or_insert<G, F>(&self, f: F) -> &T::Stored
Returns a reference to the TypedProperty
stored in the cell.
This method will then return the correct TypedProperty
reference for the given type T
.
If there is no entry found, a new one will be generated from the given function.
Auto Trait Implementations§
impl<T> RefUnwindSafe for GenericTypeCell<T>
impl<T> Send for GenericTypeCell<T>
impl<T> Sync for GenericTypeCell<T>
impl<T> Unpin for GenericTypeCell<T>
impl<T> UnwindSafe for GenericTypeCell<T>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.