use std::default::Default;
use crate::{usage_types::coordinates::Coordinate, VectorGrid};
impl<ItemType: Default + Clone> VectorGrid<ItemType> {
pub fn extend_dimension(
&mut self,
dimension: usize,
distance: usize,
amount: usize
) {
if dimension == self.defined_shape.len() {
self.items.splice(0..0, vec![Default::default(); self.step_sizes()[dimension] * amount]);
return;
}
let mut i = distance * self.step_sizes()[dimension + 1];
self.defined_shape[dimension] = self.defined_shape[dimension].saturating_add(amount);
let step_sizes = self.step_sizes();
while i < self.items.len() {
self.items.splice(i..i, vec![Default::default(); amount * step_sizes[dimension]]);
i += step_sizes[dimension + 1];
}
}
pub fn extend_inwards(&mut self, axis: usize, amount: usize) {
let mut i = 0;
match self.defined_shape.get_mut(axis) {
Some(dimension) => *dimension = dimension.saturating_add(amount),
None => {
self.items.splice(0..0, vec![Default::default(); self.step_sizes()[axis] * amount]);
return;
},
}
let step_sizes = self.step_sizes();
while i < self.items.len() {
self.items.splice(i..i, vec![Default::default(); amount * step_sizes[axis]]);
i += step_sizes[axis + 1];
}
}
pub fn extend_outwards(&mut self, axis: usize, amount: usize) {
let mut i = match self.step_sizes().get(axis + 1) {
Some(i) => *i as usize,
None => {
return;
},
};
self.defined_shape[axis] = self.defined_shape[axis].saturating_add(amount);
let step_sizes = self.step_sizes();
while i < self.items.len() {
self.items.splice(i..i, vec![Default::default(); amount * step_sizes[axis]]);
i += step_sizes[axis + 1];
}
}
pub fn scale_to_encompace(&mut self, coordinate: &mut Coordinate) {
for (i, dimension) in coordinate.iter_mut().enumerate() {
if *dimension < 0 {
self.extend_inwards(i, -*dimension as usize);
*dimension = 0;
} else if i < self.defined_shape.len() {
if *dimension as usize > self.defined_shape[i].get() {
self.extend_outwards(i, *dimension as usize - self.defined_shape[i].get());
}
} else {
break;
}
}
let corner_index = self.get_coordinate_index(&coordinate);
if self.items.len() < corner_index {
self.extend(corner_index - self.items.len())
}
}
pub fn extend(&mut self, amount: usize) {
self.items.extend(vec![Default::default(); amount])
}
}