[][src]Struct specs::storage::Storage

pub struct Storage<'e, T, D> { /* fields omitted */ }

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.

Methods

impl<'e, T, D> Storage<'e, T, D> where
    T: Component,
    D: DerefMut<Target = MaskedStorage<T>>, 
[src]

pub fn entry<'a>(
    &'a mut self,
    e: Entity
) -> Result<StorageEntry<'a, 'e, T, D>, WrongGeneration> where
    'e: 'a, 
[src]

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 });
}

pub fn entries<'a>(&'a mut self) -> Entries<'a, 'e, T, D>[src]

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
    }
}

impl<'st, T, D> Storage<'st, T, D> where
    T: Component,
    D: Deref<Target = MaskedStorage<T>>, 
[src]

pub fn restrict<'rf>(
    &'rf self
) -> RestrictedStorage<'rf, 'st, T, &T::Storage, &BitSet, ImmutableParallelRestriction>
[src]

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.

impl<'st, T, D> Storage<'st, T, D> where
    T: Component,
    D: DerefMut<Target = MaskedStorage<T>>, 
[src]

pub fn restrict_mut<'rf>(
    &'rf mut self
) -> RestrictedStorage<'rf, 'st, T, &mut T::Storage, &BitSet, SequentialRestriction>
[src]

Builds a mutable RestrictedStorage out of a Storage. Allows restricted access to the inner components without allowing invalidating the bitset for iteration in Join.

pub fn par_restrict_mut<'rf>(
    &'rf mut self
) -> RestrictedStorage<'rf, 'st, T, &mut T::Storage, &BitSet, MutableParallelRestriction>
[src]

Builds a mutable, parallel RestrictedStorage, does not allow mutably getting other components aside from the current iteration.

impl<'e, T, D> Storage<'e, T, D> where
    T: Component,
    T::Storage: Tracked,
    D: Deref<Target = MaskedStorage<T>>, 
[src]

pub fn channel(&self) -> &EventChannel<ComponentEvent>[src]

Returns the event channel tracking modified components.

impl<'e, T, D> Storage<'e, T, D> where
    T: Component,
    T::Storage: Tracked,
    D: DerefMut<Target = MaskedStorage<T>>, 
[src]

pub fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent>[src]

Returns the event channel for insertions/removals/modifications of this storage's components.

pub fn register_reader(&mut self) -> ReaderId<ComponentEvent>[src]

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.

pub fn flag(&mut self, event: ComponentEvent)[src]

Flags an index with a ComponentEvent.

impl<'e, T, D> Storage<'e, T, D>[src]

pub fn new(entities: Fetch<'e, EntitiesRes>, data: D) -> Storage<'e, T, D>[src]

Creates a new Storage from a fetched allocator and a immutable or mutable MaskedStorage, named data.

impl<'e, T, D> Storage<'e, T, D> where
    T: Component,
    D: Deref<Target = MaskedStorage<T>>, 
[src]

pub fn unprotected_storage(&self) -> &T::Storage[src]

Gets the wrapped storage.

pub fn fetched_entities(&self) -> &EntitiesRes[src]

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.

pub fn get(&self, e: Entity) -> Option<&T>[src]

Tries to read the data associated with an Entity.

pub fn count(&self) -> usize[src]

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.

pub fn is_empty(&self) -> bool[src]

Checks whether this Storage is empty. This operation is very cheap.

pub fn contains(&self, e: Entity) -> bool[src]

Returns true if the storage has a component for this entity, and that entity is alive.

pub fn mask(&self) -> &BitSet[src]

Returns a reference to the bitset of this storage which allows filtering by the component type without actually getting the component.

impl<'e, T, D> Storage<'e, T, D> where
    T: Component,
    D: DerefMut<Target = MaskedStorage<T>>, 
[src]

pub unsafe fn unprotected_storage_mut(&mut self) -> &mut T::Storage[src]

Gets mutable access to the wrapped storage.

Safety

This is unsafe because modifying the wrapped storage without also updating the mask bitset accordingly can result in illegal memory access.

pub fn get_mut(&mut self, e: Entity) -> Option<&mut T>[src]

Tries to mutate the data associated with an Entity.

pub fn insert(&mut self, e: Entity, v: T) -> InsertResult<T>[src]

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.

pub fn remove(&mut self, e: Entity) -> Option<T>[src]

Removes the data associated with an Entity.

pub fn clear(&mut self)[src]

Clears the contents of the storage.

pub fn drain(&mut self) -> Drain<T>[src]

Creates a draining storage wrapper which can be .joined to get a draining iterator.

Trait Implementations

impl<'a, 'e, T, D> ParJoin for &'a Storage<'e, T, D> where
    T: Component,
    D: Deref<Target = MaskedStorage<T>>,
    T::Storage: Sync
[src]

fn par_join(self) -> JoinParIter<Self> where
    Self: Sized
[src]

Create a joined parallel iterator over the contents.

impl<'a, 'e, T, D> ParJoin for &'a mut Storage<'e, T, D> where
    T: Component,
    D: DerefMut<Target = MaskedStorage<T>>,
    T::Storage: Sync + DistinctStorage
[src]

fn par_join(self) -> JoinParIter<Self> where
    Self: Sized
[src]

Create a joined parallel iterator over the contents.

impl<'a, 'e, T, D> Join for &'a Storage<'e, T, D> where
    T: Component,
    D: Deref<Target = MaskedStorage<T>>, 
[src]

type Mask = &'a BitSet

Type of joined bit mask.

type Type = &'a T

Type of joined components.

type Value = &'a T::Storage

Type of joined storages.

Important traits for JoinIter<J>
fn join(self) -> JoinIter<Self> where
    Self: Sized
[src]

Create a joined iterator over the contents.

fn maybe(self) -> MaybeJoin<Self> where
    Self: Sized
[src]

Returns a Join-able structure that yields all indices, returning None for all missing elements and Some(T) for found elements. Read more

fn is_unconstrained() -> bool[src]

If this 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. Read more

impl<'a, 'e, T, D> Join for &'a mut Storage<'e, T, D> where
    T: Component,
    D: DerefMut<Target = MaskedStorage<T>>, 
[src]

type Mask = &'a BitSet

Type of joined bit mask.

type Type = &'a mut T

Type of joined components.

type Value = &'a mut T::Storage

Type of joined storages.

Important traits for JoinIter<J>
fn join(self) -> JoinIter<Self> where
    Self: Sized
[src]

Create a joined iterator over the contents.

fn maybe(self) -> MaybeJoin<Self> where
    Self: Sized
[src]

Returns a Join-able structure that yields all indices, returning None for all missing elements and Some(T) for found elements. Read more

fn is_unconstrained() -> bool[src]

If this 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. Read more

impl<'a, T: Component, D> DistinctStorage for Storage<'a, T, D> where
    T::Storage: DistinctStorage
[src]

impl<'a, 'e, T, D> Not for &'a Storage<'e, T, D> where
    T: Component,
    D: Deref<Target = MaskedStorage<T>>, 
[src]

type Output = AntiStorage<'a>

The resulting type after applying the ! operator.

Auto Trait Implementations

impl<'e, T, D> Unpin for Storage<'e, T, D> where
    D: Unpin,
    T: Unpin

impl<'e, T, D> Sync for Storage<'e, T, D> where
    D: Sync,
    T: Sync

impl<'e, T, D> Send for Storage<'e, T, D> where
    D: Send,
    T: Send

impl<'e, T, D> !UnwindSafe for Storage<'e, T, D>

impl<'e, T, D> !RefUnwindSafe for Storage<'e, T, D>

Blanket Implementations

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<'a, T> DynamicSystemData<'a> for T where
    T: SystemData<'a>, 
[src]

type Accessor = StaticAccessor<T>

The accessor of the SystemData, which specifies the read and write dependencies and does the fetching. Read more

impl<T> Resource for T where
    T: Any + Send + Sync
[src]

impl<T> Any for T where
    T: Any
[src]

impl<T> Event for T where
    T: Send + Sync + 'static, 
[src]