use storage::{InsertResult, ReadStorage, WriteStorage};
use world::{Component, Entity};
pub struct Seal;
pub trait GenericReadStorage {
type Component: Component;
fn get(&self, entity: Entity) -> Option<&Self::Component>;
fn _private() -> Seal;
}
impl<'a, T> GenericReadStorage for ReadStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get(&self, entity: Entity) -> Option<&Self::Component> {
ReadStorage::get(self, entity)
}
fn _private() -> Seal {
Seal
}
}
impl<'a: 'b, 'b, T> GenericReadStorage for &'b ReadStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get(&self, entity: Entity) -> Option<&Self::Component> {
ReadStorage::get(*self, entity)
}
fn _private() -> Seal {
Seal
}
}
impl<'a, T> GenericReadStorage for WriteStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get(&self, entity: Entity) -> Option<&Self::Component> {
WriteStorage::get(self, entity)
}
fn _private() -> Seal {
Seal
}
}
impl<'a: 'b, 'b, T> GenericReadStorage for &'b WriteStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get(&self, entity: Entity) -> Option<&Self::Component> {
WriteStorage::get(*self, entity)
}
fn _private() -> Seal {
Seal
}
}
pub trait GenericWriteStorage {
type Component: Component;
fn get_mut(&mut self, entity: Entity) -> Option<&mut Self::Component>;
fn insert(&mut self, entity: Entity, comp: Self::Component) -> InsertResult<Self::Component>;
fn remove(&mut self, entity: Entity);
fn _private() -> Seal;
}
impl<'a, T> GenericWriteStorage for WriteStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get_mut(&mut self, entity: Entity) -> Option<&mut Self::Component> {
WriteStorage::get_mut(self, entity)
}
fn insert(&mut self, entity: Entity, comp: Self::Component) -> InsertResult<Self::Component> {
WriteStorage::insert(self, entity, comp)
}
fn remove(&mut self, entity: Entity) {
WriteStorage::remove(self, entity);
}
fn _private() -> Seal {
Seal
}
}
impl<'a: 'b, 'b, T> GenericWriteStorage for &'b mut WriteStorage<'a, T>
where
T: Component,
{
type Component = T;
fn get_mut(&mut self, entity: Entity) -> Option<&mut Self::Component> {
WriteStorage::get_mut(*self, entity)
}
fn insert(&mut self, entity: Entity, comp: Self::Component) -> InsertResult<Self::Component> {
WriteStorage::insert(*self, entity, comp)
}
fn remove(&mut self, entity: Entity) {
WriteStorage::remove(*self, entity);
}
fn _private() -> Seal {
Seal
}
}