use core::fmt::Debug;
use facet_core::{NdArrayDef, PtrMut};
use crate::peek::StrideError;
use super::Poke;
pub struct PokeNdArray<'mem, 'facet> {
value: Poke<'mem, 'facet>,
def: NdArrayDef,
}
impl Debug for PokeNdArray<'_, '_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("PokeNdArray").finish_non_exhaustive()
}
}
impl<'mem, 'facet> PokeNdArray<'mem, 'facet> {
#[inline]
pub const unsafe fn new(value: Poke<'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<crate::Peek<'_, 'facet>> {
let item = unsafe { (self.def.vtable.get)(self.value.data(), index)? };
Some(unsafe { crate::Peek::unchecked_new(item, self.def.t()) })
}
pub fn get_mut(&mut self, index: usize) -> Option<Poke<'_, 'facet>> {
let get_mut_fn = self.def.vtable.get_mut?;
let item = unsafe { get_mut_fn(self.value.data_mut(), index)? };
Some(unsafe { Poke::from_raw_parts(item, self.def.t()) })
}
#[inline]
pub fn as_mut_ptr(&mut self) -> Result<PtrMut, StrideError> {
let Some(as_mut_ptr) = self.def.vtable.as_mut_ptr else {
return Err(StrideError::NotStrided);
};
Ok(unsafe { as_mut_ptr(self.value.data_mut()) })
}
#[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 def(&self) -> NdArrayDef {
self.def
}
#[inline]
pub const fn into_inner(self) -> Poke<'mem, 'facet> {
self.value
}
#[inline]
pub fn as_peek_ndarray(&self) -> crate::PeekNdArray<'_, 'facet> {
unsafe { crate::PeekNdArray::new(self.value.as_peek(), self.def) }
}
}