use super::*;
pub trait GridStorage {
type Item;
fn storage_get (& self, idx: usize) -> Option <Self::Item>;
fn storage_set (& mut self, idx: usize, item: Self::Item);
fn storage_len (& self) -> usize;
}
impl <Item, const LEN: usize> GridStorage for [Item; LEN] where Item: Clone {
type Item = Item;
#[ inline ]
fn storage_get (& self, idx: usize) -> Option <Item> {
self.get (idx).cloned ()
}
#[ inline ]
fn storage_set (& mut self, idx: usize, item: Self::Item) {
self [idx] = item;
}
#[ inline ]
fn storage_len (& self) -> usize {
self.len ()
}
}
impl <Item> GridStorage for Vec <Item> where Item: Clone {
type Item = Item;
#[ inline ]
fn storage_get (& self, idx: usize) -> Option <Item> {
self.get (idx).cloned ()
}
#[ inline ]
fn storage_set (& mut self, idx: usize, item: Self::Item) {
self [idx] = item;
}
#[ inline ]
fn storage_len (& self) -> usize {
self.len ()
}
}
impl <Item, Encoding> GridStorage for BitVec <Item, Encoding>
where
Encoding: BitVecEncoding <Item>,
Item: Clone {
type Item = Item;
#[ inline ]
fn storage_get (& self, idx: usize) -> Option <Item> {
self.get (idx)
}
#[ inline ]
fn storage_set (& mut self, idx: usize, item: Self::Item) {
self.set (idx, item);
}
#[ inline ]
fn storage_len (& self) -> usize {
self.len ()
}
}
pub trait GridStorageMut: GridStorage {
fn storage_ref (& self, idx: usize) -> Option <& Self::Item>;
fn storage_mut (& mut self, idx: usize) -> Option <& mut Self::Item>;
}
impl <Item> GridStorageMut for Vec <Item> where Item: Clone {
#[ inline ]
fn storage_ref (& self, idx: usize) -> Option <& Item> {
self.get (idx)
}
#[ inline ]
fn storage_mut (& mut self, idx: usize) -> Option <& mut Item> {
self.get_mut (idx)
}
}
pub trait GridStorageIntoIter {
type Item;
type Iter: Iterator <Item = Self::Item>;
fn storage_iter (& self) -> Self::Iter;
}
impl <'sto, Item> GridStorageIntoIter for & 'sto Vec <Item> where Item: Clone {
type Item = Item;
type Iter = GridStorageClone <SliceIter <'sto, Item>>;
#[ inline ]
fn storage_iter (& self) -> Self::Iter {
GridStorageClone::new (self.iter ())
}
}
impl <'sto, Item, Encoding> GridStorageIntoIter for & 'sto BitVec <Item, Encoding>
where
Encoding: BitVecEncoding <Item>,
Item: Clone {
type Item = Item;
type Iter = BitVecIter <'sto, Item, Encoding>;
#[ inline ]
fn storage_iter (& self) -> Self::Iter {
self.iter ()
}
}