use std::ops::*;
use dcl_data_structures::grid_type::ArrayGrid;
use dcl_data_structures::prelude::PointIndex;
use crate::prelude::{Adjustable, AdjustmentError, UpdateError};
use super::*;
impl<T> Adjustable<T> for AdjustableData<T>
where
T: Default
+ Add<T, Output = T>
+ Sub<T, Output = T>
+ Mul<T, Output = T>
+ Copy
+ PartialEq
+ PartialOrd,
{
fn update<const W: usize, const H: usize, const D: usize, const C: usize>(
&mut self,
array_grid: &ArrayGrid<T, W, H, D, C>,
) -> Result<(), UpdateError> {
let p = PointIndex::new1d(0);
let update_data = array_grid.get(p);
if update_data == T::default() {
return Err(UpdateError("Update failed, new data is ZERO".into()));
}
self.data = update_data;
Ok(())
}
fn adjust<const W: usize, const H: usize, const D: usize, const C: usize>(
&mut self,
array_grid: &ArrayGrid<T, W, H, D, C>,
) -> Result<(), AdjustmentError> {
let p = PointIndex::new1d(0);
let new_data = array_grid.get(p);
let adjusted_data = self.data + new_data;
if adjusted_data < T::default() {
return Err(AdjustmentError(
"Adjustment failed, result is a negative number".into(),
));
}
self.data = adjusted_data;
Ok(())
}
}