use std::ops::{Index, IndexMut};
use crate::{usage_types::coordinates::Coordinate, VectorGrid};
impl<ItemType> Index<&Coordinate> for VectorGrid<ItemType> {
type Output = ItemType;
fn index(&self, index: &Coordinate) -> &Self::Output {
&self.items[self.get_coordinate_index(index)]
}
}
impl<ItemType> IndexMut<&Coordinate> for VectorGrid<ItemType> {
fn index_mut(&mut self, index: &Coordinate) -> &mut Self::Output {
let index = self.get_coordinate_index(index);
&mut self.items[index]
}
}
impl<ItemType> VectorGrid<ItemType> {
pub fn get(&self, at: &Coordinate) -> Option<&ItemType> {
if self.is_inside_grid(&at) {
Some(&self.items[self.get_coordinate_index(&at)])
} else {
None
}
}
pub fn get_mut(&mut self, at: &Coordinate) -> Option<&mut ItemType> {
if self.is_inside_grid(&at) {
let index = self.get_coordinate_index(&at);
Some(&mut self.items[index])
} else {
None
}
}
}
impl<ItemType: Clone + Default> VectorGrid<ItemType> {
pub fn get_or_default(&self, at: &Coordinate) -> ItemType {
match self.get(at) {
Some(some) => some.clone(),
None => ItemType::default(),
}
}
}