blob: 7099a96bc2782a38b4af5c62d6d547993913a93a [file] [log] [blame]
//! Enum Maps
pub mod axis {
use crate::Axis;
const LENGTH: usize = 4;
pub struct Items<'a, T>
where
T: 'a,
{
map: &'a Map<T>,
state: Option<Axis>,
}
impl<'a, T> Iterator for Items<'a, T> {
type Item = (Axis, &'a T);
fn next(&mut self) -> Option<(Axis, &'a T)> {
while let Some(key) = self.state {
self.state = key.next();
if let Some(value) = self.map.get(key) {
return Some((key, value));
}
}
None
}
}
pub struct Map<T>([Option<T>; LENGTH]);
impl<T> Default for Map<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> Map<T> {
pub fn new() -> Map<T> {
Map([None, None, None, None])
}
pub fn contains_key(&self, key: Axis) -> bool {
self.0[key as usize].is_some()
}
pub fn get(&self, key: Axis) -> Option<&T> {
self.0[key as usize].as_ref()
}
pub fn get_mut(&mut self, key: Axis) -> Option<&mut T> {
self.0[key as usize].as_mut()
}
pub fn insert(&mut self, key: Axis, value: T) -> Option<T> {
let key = key as usize;
let old = self.0[key].take();
self.0[key] = Some(value);
old
}
pub fn iter(&self) -> Items<T> {
Items {
map: self,
state: Some(Axis::BottomX),
}
}
}
impl<T> Clone for Map<T>
where
T: Clone,
{
fn clone(&self) -> Map<T> {
Map([
self.0[0].clone(),
self.0[1].clone(),
self.0[2].clone(),
self.0[3].clone(),
])
}
}
}
pub mod grid {
use crate::Grid;
const LENGTH: usize = 2;
pub struct Items<'a, T>
where
T: 'a,
{
map: &'a Map<T>,
state: Option<Grid>,
}
impl<'a, T> Iterator for Items<'a, T> {
type Item = (Grid, &'a T);
fn next(&mut self) -> Option<(Grid, &'a T)> {
while let Some(key) = self.state {
self.state = key.next();
if let Some(value) = self.map.get(key) {
return Some((key, value));
}
}
None
}
}
pub struct Map<T>([Option<T>; LENGTH]);
impl<T> Map<T> {
pub fn new() -> Map<T> {
Map([None, None])
}
pub fn contains_key(&self, key: Grid) -> bool {
self.0[key as usize].is_some()
}
pub fn get(&self, key: Grid) -> Option<&T> {
self.0[key as usize].as_ref()
}
pub fn get_mut(&mut self, key: Grid) -> Option<&mut T> {
self.0[key as usize].as_mut()
}
pub fn insert(&mut self, key: Grid, value: T) -> Option<T> {
let key = key as usize;
let old = self.0[key].take();
self.0[key] = Some(value);
old
}
pub fn iter(&self) -> Items<T> {
Items {
map: self,
state: Some(Grid::Major),
}
}
}
impl<T> Clone for Map<T>
where
T: Clone,
{
fn clone(&self) -> Map<T> {
Map([self.0[0].clone(), self.0[1].clone()])
}
}
impl<T> Default for Map<T> {
fn default() -> Self {
Self::new()
}
}
}