use ilattice::glam::UVec3;
use ilattice::prelude::Extent;
use ndshape::Shape;
pub fn assert_in_bounds<T, S>(voxels: &[T], voxels_shape: &S, min: [u32; 3], max: [u32; 3])
where
S: Shape<3, Coord = u32>,
{
assert!(
voxels_shape.size() as usize <= voxels.len(),
"voxel buffer size {:?} is less than the shape size {:?}; would cause access out of bounds",
voxels.len(),
voxels_shape.size()
);
let shape = voxels_shape.as_array();
let local_extent = Extent::from_min_and_shape(UVec3::ZERO, UVec3::from(shape));
local_extent
.check_positive_shape()
.unwrap_or_else(|| panic!("Invalid shape={shape:?}"));
let query_extent = Extent::from_min_and_max(UVec3::from(min), UVec3::from(max));
query_extent.check_positive_shape().unwrap_or_else(|| {
panic!("Invalid extent min={min:?} max={max:?}; has non-positive shape")
});
assert!(
query_extent.is_subset_of(&local_extent),
"min={min:?} max={max:?} would access out of bounds"
);
}