use crate::limits::MAX_DIMENSIONS;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct Shape {
sizes: [u8; MAX_DIMENSIONS],
ndim: u8,
}
impl Shape {
#[must_use]
pub const fn new(dimensions: &[u8]) -> Option<Self> {
let ndim = dimensions.len();
if ndim == 0 || ndim > MAX_DIMENSIONS {
return None;
}
let mut sizes = [0u8; MAX_DIMENSIONS];
let mut i = 0;
while i < ndim {
if dimensions[i] == 0 {
return None;
}
sizes[i] = dimensions[i];
i += 1;
}
#[allow(clippy::cast_possible_truncation)] Some(Self {
sizes,
ndim: ndim as u8,
})
}
#[must_use]
pub(crate) const fn from_sizes(sizes: [u8; MAX_DIMENSIONS], ndim: u8) -> Self {
Self { sizes, ndim }
}
#[must_use]
pub fn dimensions(&self) -> &[u8] {
&self.sizes[..self.ndim as usize]
}
#[must_use]
pub const fn dimension_count(&self) -> usize {
self.ndim as usize
}
#[must_use]
pub const fn square_count(&self) -> u32 {
let mut product: u32 = 1;
let mut i = 0;
while i < self.ndim as usize {
product *= self.sizes[i] as u32;
i += 1;
}
product
}
}
impl core::fmt::Debug for Shape {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_tuple("Shape").field(&self.dimensions()).finish()
}
}