Struct 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 + Typed + 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)
                .with_generics(Generics::from_iter([TypeParamInfo::new::<T>("T")]));
            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>

Source

pub const fn new() -> Self

Initialize a GenericTypeCell for generic types.

Source

pub fn get_or_insert<G, F>(&self, f: F) -> &T::Stored
where G: Any + ?Sized, F: FnOnce() -> 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.

Trait Implementations§

Source§

impl<T: TypedProperty> Default for GenericTypeCell<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for GenericTypeCell<T>

§

impl<T> RefUnwindSafe for GenericTypeCell<T>

§

impl<T> Send for GenericTypeCell<T>
where <T as TypedProperty>::Stored: Sync,

§

impl<T> Sync for GenericTypeCell<T>
where <T as TypedProperty>::Stored: Sync,

§

impl<T> Unpin for GenericTypeCell<T>

§

impl<T> UnwindSafe for GenericTypeCell<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &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)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V