bevy_reflect::utility

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>

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>

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)

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)

Convert &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> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,