use crate::grid::bounds::BoundsError;
use crate::grid::Grid;
use crate::location::{Location, LocationLike};
pub trait GridSetter: Grid {
#[must_use = "discarded return value of replace_unchecked; consider using set_unchecked"]
unsafe fn replace_unchecked(&mut self, location: &Location, value: Self::Item) -> Self::Item;
#[inline]
unsafe fn set_unchecked(&mut self, location: &Location, value: Self::Item) {
let _ = self.replace_unchecked(location, value);
}
#[inline]
fn replace(
&mut self,
location: impl LocationLike,
value: Self::Item,
) -> Result<Self::Item, BoundsError> {
self.check_location(location)
.map(move |loc| unsafe { self.replace_unchecked(&loc, value) })
}
#[inline]
fn set(&mut self, location: impl LocationLike, value: Self::Item) -> Result<(), BoundsError> {
self.check_location(location)
.map(move |loc| unsafe { self.set_unchecked(&loc, value) })
}
}
impl<G: GridSetter> GridSetter for &mut G {
#[inline]
unsafe fn replace_unchecked(&mut self, location: &Location, value: Self::Item) -> Self::Item {
G::replace_unchecked(self, location, value)
}
#[inline]
unsafe fn set_unchecked(&mut self, location: &Location, value: Self::Item) {
G::set_unchecked(self, location, value)
}
#[inline]
fn replace(
&mut self,
location: impl LocationLike,
value: Self::Item,
) -> Result<Self::Item, BoundsError> {
G::replace(self, location, value)
}
#[inline]
fn set(&mut self, location: impl LocationLike, value: Self::Item) -> Result<(), BoundsError> {
G::set(self, location, value)
}
}