use crate::{VolAddress, VolGrid2d};
#[repr(transparent)]
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct VolGrid2dStrided<
T,
R,
W,
const WIDTH: usize,
const HEIGHT: usize,
const FRAMES: usize,
const BYTE_STRIDE: usize,
> {
pub(crate) base: VolAddress<T, R, W>,
}
impl<
T,
R,
W,
const WIDTH: usize,
const HEIGHT: usize,
const FRAMES: usize,
const BYTE_STRIDE: usize,
> Clone for VolGrid2dStrided<T, R, W, WIDTH, HEIGHT, FRAMES, BYTE_STRIDE>
{
#[inline]
#[must_use]
fn clone(&self) -> Self {
*self
}
}
impl<
T,
R,
W,
const WIDTH: usize,
const HEIGHT: usize,
const FRAMES: usize,
const BYTE_STRIDE: usize,
> Copy for VolGrid2dStrided<T, R, W, WIDTH, HEIGHT, FRAMES, BYTE_STRIDE>
{
}
impl<
T,
R,
W,
const WIDTH: usize,
const HEIGHT: usize,
const FRAMES: usize,
const BYTE_STRIDE: usize,
> VolGrid2dStrided<T, R, W, WIDTH, HEIGHT, FRAMES, BYTE_STRIDE>
{
#[inline]
#[must_use]
pub const unsafe fn new(address: usize) -> Self {
Self { base: VolAddress::new(address) }
}
#[inline]
#[must_use]
pub const fn get_frame(
self, z: usize,
) -> Option<VolGrid2d<T, R, W, WIDTH, HEIGHT>> {
if z < FRAMES {
Some(unsafe {
VolGrid2d {
base: self.base.cast::<u8>().add(z * BYTE_STRIDE).cast::<T>(),
}
})
} else {
None
}
}
}
#[test]
fn test_vol_grid_2d_strided() {
let small: VolGrid2dStrided<u8, (), (), 10, 10, 6, 0x100> =
unsafe { VolGrid2dStrided::new(0x1000) };
assert_eq!(small.get_frame(0).unwrap().as_usize(), 0x1000);
assert_eq!(small.get_frame(1).unwrap().as_usize(), 0x1100);
assert_eq!(small.get_frame(2).unwrap().as_usize(), 0x1200);
assert_eq!(small.get_frame(3).unwrap().as_usize(), 0x1300);
assert_eq!(small.get_frame(4).unwrap().as_usize(), 0x1400);
assert_eq!(small.get_frame(5).unwrap().as_usize(), 0x1500);
assert!(small.get_frame(6).is_none());
}