use crate::geometry::Geometry;
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct Shape {
pub rows: usize,
pub cols: usize,
pub padded_rows: usize,
pub padded_cols: usize,
}
impl Shape {
pub fn new(rows: usize, cols: usize, geom: &Geometry) -> Self {
Shape {
rows,
cols,
padded_rows: geom.pad_rows(rows),
padded_cols: geom.pad_cols(cols),
}
}
#[inline]
pub const fn logical_len(&self) -> usize {
self.rows * self.cols
}
#[inline]
pub const fn padded_len(&self) -> usize {
self.padded_rows * self.padded_cols
}
#[inline]
pub const fn padding_len(&self) -> usize {
self.padded_len() - self.logical_len()
}
#[inline]
pub fn padding_ratio(&self) -> f64 {
if self.padded_len() == 0 {
0.0
} else {
self.padding_len() as f64 / self.padded_len() as f64
}
}
#[inline]
pub const fn is_exact(&self) -> bool {
self.rows == self.padded_rows && self.cols == self.padded_cols
}
#[inline]
pub const fn contains(&self, row: usize, col: usize) -> bool {
row < self.rows && col < self.cols
}
}
impl core::fmt::Debug for Shape {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Shape {{ {}x{} logical -> {}x{} padded }}",
self.rows, self.cols, self.padded_rows, self.padded_cols
)
}
}