pub struct Storage<'e, T, D> { /* private fields */ }Expand description
A wrapper around the masked storage and the generations vector.
Can be used for safe lookup of components, insertions and removes.
This is what World::read/write fetches for the user.
Implementations§
Source§impl<'st, T, D> Storage<'st, T, D>
impl<'st, T, D> Storage<'st, T, D>
Sourcepub fn restrict<'rf>(
&'rf self,
) -> RestrictedStorage<'rf, 'st, T, &'rf <T as Component>::Storage, &'rf BitSet, ImmutableParallelRestriction>
pub fn restrict<'rf>( &'rf self, ) -> RestrictedStorage<'rf, 'st, T, &'rf <T as Component>::Storage, &'rf BitSet, ImmutableParallelRestriction>
Builds an immutable RestrictedStorage out of a Storage. Allows deferred
unchecked access to the entity’s component.
This is returned as a ParallelRestriction version since you can only get
immutable components with this which is safe for parallel by default.
Source§impl<'st, T, D> Storage<'st, T, D>
impl<'st, T, D> Storage<'st, T, D>
Sourcepub fn restrict_mut<'rf>(
&'rf mut self,
) -> RestrictedStorage<'rf, 'st, T, &'rf mut <T as Component>::Storage, &'rf BitSet, SequentialRestriction>
pub fn restrict_mut<'rf>( &'rf mut self, ) -> RestrictedStorage<'rf, 'st, T, &'rf mut <T as Component>::Storage, &'rf BitSet, SequentialRestriction>
Builds a mutable RestrictedStorage out of a Storage. Allows restricted
access to the inner components without allowing invalidating the
bitset for iteration in Join.
Sourcepub fn par_restrict_mut<'rf>(
&'rf mut self,
) -> RestrictedStorage<'rf, 'st, T, &'rf mut <T as Component>::Storage, &'rf BitSet, MutableParallelRestriction>
pub fn par_restrict_mut<'rf>( &'rf mut self, ) -> RestrictedStorage<'rf, 'st, T, &'rf mut <T as Component>::Storage, &'rf BitSet, MutableParallelRestriction>
Builds a mutable, parallel RestrictedStorage,
does not allow mutably getting other components
aside from the current iteration.
Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub fn channel(&self) -> &EventChannel<ComponentEvent>
pub fn channel(&self) -> &EventChannel<ComponentEvent>
Returns the event channel tracking modified components.
Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent>
pub fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent>
Returns the event channel for insertions/removals/modifications of this storage’s components.
Sourcepub fn register_reader(&mut self) -> ReaderId<ComponentEvent>
pub fn register_reader(&mut self) -> ReaderId<ComponentEvent>
Starts tracking component events. Note that this reader id should be used every frame, otherwise events will pile up and memory use by the event channel will grow waiting for this reader.
Sourcepub fn flag(&mut self, event: ComponentEvent)
pub fn flag(&mut self, event: ComponentEvent)
Flags an index with a ComponentEvent.
Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub fn entry<'a>(
&'a mut self,
e: Entity,
) -> Result<StorageEntry<'a, 'e, T, D>, WrongGeneration>where
'e: 'a,
pub fn entry<'a>(
&'a mut self,
e: Entity,
) -> Result<StorageEntry<'a, 'e, T, D>, WrongGeneration>where
'e: 'a,
Returns an entry to the component associated to the entity.
Behaves somewhat similarly to std::collections::HashMap’s entry api.
§Example
if let Ok(entry) = storage.entry(entity) {
entry.or_insert(Comp { field: 55 });
}Sourcepub fn entries<'a>(&'a mut self) -> Entries<'a, 'e, T, D>
pub fn entries<'a>(&'a mut self) -> Entries<'a, 'e, T, D>
Returns a Join-able structure that yields all indices, returning
Entry for all elements
WARNING: Do not have a join of only Entriess. Otherwise the join will
iterate over every single index of the bitset. If you want a join with
all Entriess, add an EntitiesRes to the join as well to bound the
join to all entities that are alive.
§Example
for (mut counter, _) in (counters.entries(), &marker).join() {
let counter = counter.or_insert_with(Default::default);
counter.increase();
if counter.reached_limit() {
counter.reset();
// Do something
}
}Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub fn new(entities: Fetch<'e, EntitiesRes>, data: D) -> Storage<'e, T, D>
pub fn new(entities: Fetch<'e, EntitiesRes>, data: D) -> Storage<'e, T, D>
Creates a new Storage from a fetched allocator and a immutable or mutable MaskedStorage,
named data.
Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub fn unprotected_storage(&self) -> &<T as Component>::Storage
pub fn unprotected_storage(&self) -> &<T as Component>::Storage
Gets the wrapped storage.
Sourcepub fn fetched_entities(&self) -> &EntitiesRes
pub fn fetched_entities(&self) -> &EntitiesRes
Returns the EntitiesRes resource fetched by this storage.
This does not have anything to do with the components inside.
You only want to use this when implementing additional methods
for Storage via an extension trait.
Sourcepub fn count(&self) -> usize
pub fn count(&self) -> usize
Computes the number of elements this Storage contains by counting the bits in the bit set.
This operation will never be performed in constant time.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Checks whether this Storage is empty. This operation is very cheap.
Source§impl<'e, T, D> Storage<'e, T, D>
impl<'e, T, D> Storage<'e, T, D>
Sourcepub unsafe fn unprotected_storage_mut(
&mut self,
) -> &mut <T as Component>::Storage
pub unsafe fn unprotected_storage_mut( &mut self, ) -> &mut <T as Component>::Storage
Gets mutable access to the wrapped storage.
This is unsafe because modifying the wrapped storage without also updating the mask bitset accordingly can result in illegal memory access.
Sourcepub fn get_mut(&mut self, e: Entity) -> Option<&mut T>
pub fn get_mut(&mut self, e: Entity) -> Option<&mut T>
Tries to mutate the data associated with an Entity.
Sourcepub fn insert(&mut self, e: Entity, v: T) -> Result<Option<T>, Error>
pub fn insert(&mut self, e: Entity, v: T) -> Result<Option<T>, Error>
Inserts new data for a given Entity.
Returns the result of the operation as a InsertResult<T>
If a component already existed for the given Entity, then it will
be overwritten with the new component. If it did overwrite, then the
result will contain Some(T) where T is the previous component.
Trait Implementations§
Source§impl<'a, 'b, T> GenericReadStorage for &'b Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
impl<'a, 'b, T> GenericReadStorage for &'b Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
Source§impl<'a, 'b, T> GenericReadStorage for &'b Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
impl<'a, 'b, T> GenericReadStorage for &'b Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
Source§fn get(
&self,
entity: Entity,
) -> Option<&<&'b Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericReadStorage>::Component>
fn get( &self, entity: Entity, ) -> Option<&<&'b Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericReadStorage>::Component>
Entitys componentSource§impl<'a, T> GenericReadStorage for Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
T: Component,
impl<'a, T> GenericReadStorage for Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
T: Component,
Source§impl<'a, T> GenericReadStorage for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
impl<'a, T> GenericReadStorage for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
Source§impl<'a, 'b, T> GenericWriteStorage for &'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
impl<'a, 'b, T> GenericWriteStorage for &'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
'a: 'b,
T: Component,
Source§fn get_mut(
&mut self,
entity: Entity,
) -> Option<&mut <&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>
fn get_mut( &mut self, entity: Entity, ) -> Option<&mut <&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>
Entitys componentSource§fn insert(
&mut self,
entity: Entity,
comp: <&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component,
) -> Result<Option<<&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>, Error>
fn insert( &mut self, entity: Entity, comp: <&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component, ) -> Result<Option<<&'b mut Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>, Error>
EntitySource§impl<'a, T> GenericWriteStorage for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
impl<'a, T> GenericWriteStorage for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
Source§fn get_mut(
&mut self,
entity: Entity,
) -> Option<&mut <Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>
fn get_mut( &mut self, entity: Entity, ) -> Option<&mut <Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>
Entitys componentSource§fn insert(
&mut self,
entity: Entity,
comp: <Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component,
) -> Result<Option<<Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>, Error>
fn insert( &mut self, entity: Entity, comp: <Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component, ) -> Result<Option<<Storage<'a, T, FetchMut<'a, MaskedStorage<T>>> as GenericWriteStorage>::Component>, Error>
EntitySource§impl<'a, 'e, T, D> Join for &'a Storage<'e, T, D>
impl<'a, 'e, T, D> Join for &'a Storage<'e, T, D>
Source§unsafe fn open(
self,
) -> (<&'a Storage<'e, T, D> as Join>::Mask, <&'a Storage<'e, T, D> as Join>::Value)
unsafe fn open( self, ) -> (<&'a Storage<'e, T, D> as Join>::Mask, <&'a Storage<'e, T, D> as Join>::Value)
Source§unsafe fn get(v: &mut <&'a Storage<'e, T, D> as Join>::Value, i: u32) -> &'a T
unsafe fn get(v: &mut <&'a Storage<'e, T, D> as Join>::Value, i: u32) -> &'a T
Source§fn join(self) -> JoinIter<Self> ⓘwhere
Self: Sized,
fn join(self) -> JoinIter<Self> ⓘwhere
Self: Sized,
Source§fn maybe(self) -> MaybeJoin<Self>where
Self: Sized,
fn maybe(self) -> MaybeJoin<Self>where
Self: Sized,
Join-able structure that yields all indices, returning None for all
missing elements and Some(T) for found elements. Read moreSource§fn is_unconstrained() -> bool
fn is_unconstrained() -> bool
Join typically returns all indices in the mask, then iterating over only it
or combined with other joins that are also dangerous will cause the JoinIter/ParJoin to
go through all indices which is usually not what is wanted and will kill performance.Source§impl<'a, 'e, T, D> Join for &'a mut Storage<'e, T, D>
impl<'a, 'e, T, D> Join for &'a mut Storage<'e, T, D>
Source§unsafe fn open(
self,
) -> (<&'a mut Storage<'e, T, D> as Join>::Mask, <&'a mut Storage<'e, T, D> as Join>::Value)
unsafe fn open( self, ) -> (<&'a mut Storage<'e, T, D> as Join>::Mask, <&'a mut Storage<'e, T, D> as Join>::Value)
Source§unsafe fn get(
v: &mut <&'a mut Storage<'e, T, D> as Join>::Value,
i: u32,
) -> &'a mut T
unsafe fn get( v: &mut <&'a mut Storage<'e, T, D> as Join>::Value, i: u32, ) -> &'a mut T
Source§fn join(self) -> JoinIter<Self> ⓘwhere
Self: Sized,
fn join(self) -> JoinIter<Self> ⓘwhere
Self: Sized,
Source§fn maybe(self) -> MaybeJoin<Self>where
Self: Sized,
fn maybe(self) -> MaybeJoin<Self>where
Self: Sized,
Join-able structure that yields all indices, returning None for all
missing elements and Some(T) for found elements. Read moreSource§fn is_unconstrained() -> bool
fn is_unconstrained() -> bool
Join typically returns all indices in the mask, then iterating over only it
or combined with other joins that are also dangerous will cause the JoinIter/ParJoin to
go through all indices which is usually not what is wanted and will kill performance.Source§impl<'a, T> SystemData<'a> for Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
T: Component,
impl<'a, T> SystemData<'a> for Storage<'a, T, Fetch<'a, MaskedStorage<T>>>where
T: Component,
Source§fn fetch(res: &'a Resources) -> Storage<'a, T, Fetch<'a, MaskedStorage<T>>>
fn fetch(res: &'a Resources) -> Storage<'a, T, Fetch<'a, MaskedStorage<T>>>
Resources. Note that this is only specified for one concrete
lifetime 'a, you need to implement the SystemData trait for every possible
lifetime.Source§impl<'a, T> SystemData<'a> for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
impl<'a, T> SystemData<'a> for Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>where
T: Component,
Source§fn fetch(res: &'a Resources) -> Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>
fn fetch(res: &'a Resources) -> Storage<'a, T, FetchMut<'a, MaskedStorage<T>>>
Resources. Note that this is only specified for one concrete
lifetime 'a, you need to implement the SystemData trait for every possible
lifetime.impl<'a, T, D> DistinctStorage for Storage<'a, T, D>
Auto Trait Implementations§
impl<'e, T, D> Freeze for Storage<'e, T, D>where
D: Freeze,
impl<'e, T, D> !RefUnwindSafe for Storage<'e, T, D>
impl<'e, T, D> Send for Storage<'e, T, D>
impl<'e, T, D> Sync for Storage<'e, T, D>
impl<'e, T, D> Unpin for Storage<'e, T, D>
impl<'e, T, D> !UnwindSafe for Storage<'e, T, D>
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
Source§impl<'a, T> DynamicSystemData<'a> for Twhere
T: SystemData<'a>,
impl<'a, T> DynamicSystemData<'a> for Twhere
T: SystemData<'a>,
Source§type Accessor = StaticAccessor<T>
type Accessor = StaticAccessor<T>
SystemData, which specifies the read and write dependencies and does
the fetching.Source§fn setup(_: &StaticAccessor<T>, res: &mut Resources)
fn setup(_: &StaticAccessor<T>, res: &mut Resources)
Resources for fetching this system data.