use crate::iterator::collapse_contiguous::collapse_to_uniform_stride;
use crate::ndarray::flags::NdArrayFlags;
#[allow(clippy::len_without_is_empty)]
pub trait StridedMemory: Sized {
fn shape(&self) -> &[usize];
fn stride(&self) -> &[usize];
fn ndims(&self) -> usize {
self.shape().len()
}
#[inline]
fn len(&self) -> usize {
if self.shape().is_empty() {
return 0;
}
self.shape()[0]
}
#[inline]
fn size(&self) -> usize {
self.shape().iter().product()
}
fn flags(&self) -> NdArrayFlags;
#[inline]
fn is_contiguous(&self) -> bool {
self.flags().contains(NdArrayFlags::Contiguous)
}
#[inline]
fn is_view(&self) -> bool {
!self.flags().contains(NdArrayFlags::Owned)
}
#[inline]
fn is_uniformly_strided(&self) -> bool {
self.flags().contains(NdArrayFlags::UniformStride)
}
#[inline]
fn has_uniform_stride(&self) -> Option<usize> {
if !self.is_uniformly_strided() {
return None;
}
if self.ndims() == 0 {
return Some(0);
}
let (_, new_stride) = collapse_to_uniform_stride(self.shape(), self.stride());
Some(new_stride[0])
}
}