use cubecl::zspace::{Shape, Strides};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StridedLayout {
RowMajor,
Explicit(Vec<usize>),
}
pub fn physical_extent(shape: &Shape, strides: &Strides) -> usize {
let mut max_offset = 0usize;
for (s, d) in strides.iter().zip(shape.iter()) {
if *d > 0 && *s > 0 {
max_offset += (d - 1) * s;
}
}
max_offset + 1
}
impl StridedLayout {
pub fn compute_strides(&self, shape: &Shape) -> Strides {
let n = shape.len();
match self {
StridedLayout::RowMajor => {
assert!(n >= 1, "RowMajor requires at least 1 dimension");
let mut strides = vec![0; n];
strides[n - 1] = 1;
for i in (0..n - 1).rev() {
strides[i] = strides[i + 1] * shape[i + 1];
}
Strides::new(&strides)
}
StridedLayout::Explicit(strides) => {
assert!(
strides.len() == n,
"Explicit strides must have the same rank as the shape"
);
strides.clone().into()
}
}
}
}