use core::{marker::PhantomData, ptr::NonNull};
use crate::Sample;
#[derive(Clone)]
pub(crate) struct StridedSampleIter<'a, S: Sample> {
pub ptr: NonNull<S>, pub stride: usize, pub remaining: usize, pub _marker: PhantomData<&'a S>, }
impl<'a, S: Sample> Iterator for StridedSampleIter<'a, S> {
type Item = &'a S;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
None
} else {
unsafe {
let current_ptr = self.ptr; self.remaining -= 1;
if self.remaining > 0 {
self.ptr = NonNull::new_unchecked(current_ptr.as_ptr().add(self.stride));
}
Some(&*current_ptr.as_ptr())
}
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<S: Sample> ExactSizeIterator for StridedSampleIter<'_, S> {}
pub(crate) struct StridedSampleIterMut<'a, S: Sample> {
pub ptr: NonNull<S>,
pub stride: usize,
pub remaining: usize,
pub _marker: PhantomData<&'a mut S>, }
impl<'a, S: Sample> Iterator for StridedSampleIterMut<'a, S> {
type Item = &'a mut S;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
None
} else {
unsafe {
let current_mut_ptr = self.ptr.as_ptr();
self.remaining -= 1;
if self.remaining > 0 {
self.ptr = NonNull::new_unchecked(current_mut_ptr.add(self.stride));
}
Some(&mut *current_mut_ptr)
}
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<S: Sample> ExactSizeIterator for StridedSampleIterMut<'_, S> {}