extern crate alloc;
pub struct IntoIter<T> {
pub(crate) v: crate::MiniVec<T>,
pub(crate) pos: *const T,
marker: core::marker::PhantomData<T>,
}
impl<T> IntoIter<T> {
#[must_use]
pub(crate) fn new(w: crate::MiniVec<T>) -> Self {
let v = w;
let pos = v.data();
Self {
v,
pos,
marker: core::marker::PhantomData,
}
}
#[must_use]
pub fn as_slice(&self) -> &[T] {
let data = self.pos;
unsafe { core::slice::from_raw_parts(data, self.v.len()) }
}
pub fn as_mut_slice(&mut self) -> &mut [T] {
let data: *mut T = self.pos.cast_mut();
unsafe { core::slice::from_raw_parts_mut(data, self.v.len()) }
}
}
impl<T> AsRef<[T]> for IntoIter<T> {
fn as_ref(&self) -> &[T] {
self.as_slice()
}
}
impl<T: Clone> Clone for IntoIter<T> {
fn clone(&self) -> IntoIter<T> {
let w = self.v.clone();
let pos_cpy = self.pos;
IntoIter {
v: w,
pos: pos_cpy,
marker: core::marker::PhantomData,
}
}
}
impl<T: alloc::fmt::Debug> alloc::fmt::Debug for IntoIter<T> {
fn fmt(&self, f: &mut alloc::fmt::Formatter<'_>) -> alloc::fmt::Result {
f.debug_tuple("MiniVec::IntoIter")
.field(&self.as_slice())
.finish()
}
}
impl<T> DoubleEndedIterator for IntoIter<T> {
fn next_back(&mut self) -> Option<Self::Item> {
let header = self.v.header_mut();
let data = self.pos;
let count = header.len;
let end = unsafe { data.add(count) };
if data >= end {
return None;
};
header.len -= 1;
Some(unsafe { core::ptr::read(data.add(header.len)) })
}
}
impl<T> Drop for IntoIter<T> {
fn drop(&mut self) {
for v in self {
core::mem::drop(v);
}
}
}
impl<T> ExactSizeIterator for IntoIter<T> {
fn len(&self) -> usize {
self.v.len()
}
}
impl<T> core::iter::FusedIterator for IntoIter<T> {}
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let header = self.v.header_mut();
let data = self.pos;
let count = header.len;
let end = unsafe { data.add(count) };
if data >= end {
return None;
}
self.pos = unsafe { data.add(1) };
header.len -= 1;
Some(unsafe { core::ptr::read(data) })
}
fn size_hint(&self) -> (usize, Option<usize>) {
let len = self.v.len();
(len, Some(len))
}
}
unsafe impl<T: Send> Send for IntoIter<T> {}
unsafe impl<T: Sync> Sync for IntoIter<T> {}