use super::Peek;
use core::fmt::Debug;
use facet_core::{NdArrayDef, PtrConst};
#[derive(Clone, Copy)]
pub struct PeekNdArray<'mem, 'facet> {
value: Peek<'mem, 'facet>,
def: NdArrayDef,
}
impl Debug for PeekNdArray<'_, '_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("PeekNdArray").finish_non_exhaustive()
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum StrideError {
NotStrided,
}
impl core::fmt::Display for StrideError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
StrideError::NotStrided => {
write!(f, "array is not strided")
}
}
}
}
impl core::fmt::Debug for StrideError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
StrideError::NotStrided => {
write!(f, "StrideError::NotStrided: array is not strided")
}
}
}
}
impl<'mem, 'facet> PeekNdArray<'mem, 'facet> {
#[inline]
pub const unsafe fn new(value: Peek<'mem, 'facet>, def: NdArrayDef) -> Self {
Self { value, def }
}
#[inline]
pub fn count(&self) -> usize {
unsafe { (self.def.vtable.count)(self.value.data()) }
}
#[inline]
pub fn n_dim(&self) -> usize {
unsafe { (self.def.vtable.n_dim)(self.value.data()) }
}
#[inline]
pub fn dim(&self, i: usize) -> Option<usize> {
unsafe { (self.def.vtable.dim)(self.value.data(), i) }
}
#[inline]
pub fn get(&self, index: usize) -> Option<Peek<'mem, 'facet>> {
let item = unsafe { (self.def.vtable.get)(self.value.data(), index)? };
Some(unsafe { Peek::unchecked_new(item, self.def.t()) })
}
#[inline]
pub fn as_ptr(&self) -> Result<PtrConst, StrideError> {
let Some(as_ptr) = self.def.vtable.as_ptr else {
return Err(StrideError::NotStrided);
};
let ptr = unsafe { as_ptr(self.value.data()) };
Ok(ptr)
}
#[inline]
pub fn byte_stride(&self, i: usize) -> Result<Option<isize>, StrideError> {
let Some(byte_stride) = self.def.vtable.byte_stride else {
return Err(StrideError::NotStrided);
};
Ok(unsafe { byte_stride(self.value.data(), i) })
}
#[inline]
pub const fn value(&self) -> Peek<'mem, 'facet> {
self.value
}
#[inline]
pub const fn def(&self) -> NdArrayDef {
self.def
}
}