/// An entry in a `Storage::map` table. #[derive(Debug)] pub(crate) enum Element<T> where
T: StorageItem,
{ /// There are no live ids with this index.
Vacant,
/// There is one live id with this index, allocated at the given /// epoch.
Occupied(T, Epoch),
}
pub(crate) trait StorageItem: ResourceType { type Marker: Marker;
}
impl<T: StorageItem> StorageItem for Arc<T> { type Marker = T::Marker;
}
#[macro_export]
macro_rules! impl_storage_item {
($ty:ident) => { impl $crate::storage::StorageItem for $ty { type Marker = $crate::id::markers::$ty;
}
};
}
/// A table of `T` values indexed by the id type `I`. /// /// `Storage` implements [`std::ops::Index`], accepting `Id` values as /// indices. /// /// The table is represented as a vector indexed by the ids' index /// values, so you should use an id allocator like `IdentityManager` /// that keeps the index values dense and close to zero. #[derive(Debug)] pub(crate) struct Storage<T> where
T: StorageItem,
{ pub(crate) map: Vec<Element<T>>,
kind: &'static str,
}
impl<T> Storage<T> where
T: StorageItem + Clone,
{ /// Get an owned reference to an item. /// Panics if there is an epoch mismatch, the entry is empty or in error. pub(crate) fn get(&self, id: Id<T::Marker>) -> T { let (index, epoch) = id.unzip(); let (result, storage_epoch) = matchself.map.get(index as usize) {
Some(&Element::Occupied(ref v, epoch)) => (v.clone(), epoch),
None | Some(&Element::Vacant) => panic!("{}[{:?}] does not exist", self.kind, id),
};
assert_eq!(
epoch, storage_epoch, "{}[{:?}] is no longer alive", self.kind, id
);
result
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.