use core::{
mem::{replace, MaybeUninit},
ops::Range,
};
use crate::drop_slice;
pub struct Remainder<const N: usize, T> {
pub(crate) remainder_chunk: [MaybeUninit<T>; N],
pub(crate) init_range: Range<usize>,
}
impl<const N: usize, T> Iterator for Remainder<N, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
(!self.init_range.is_empty()).then(|| {
let next_init = unsafe {
replace(
self.remainder_chunk
.get_unchecked_mut(self.init_range.start),
MaybeUninit::uninit(),
)
.assume_init()
};
self.init_range.start += 1;
next_init
})
}
}
impl<const N: usize, T> Drop for Remainder<N, T> {
fn drop(&mut self) {
unsafe { drop_slice(&mut self.remainder_chunk[self.init_range.clone()]) }
}
}