use crate::iters::IntoPtrsIter;
use crate::ptr;
use crate::types::ListType;
pub struct IntoBoxedIter<T, Typ>
where
T: ptr::Pointee<Metadata = ptr::DynMetadata<T>> + ?Sized,
Typ: ListType<T>,
{
pub(crate) inner: IntoPtrsIter<T, Typ>,
}
impl<T, Typ> Iterator for IntoBoxedIter<T, Typ>
where
T: ptr::Pointee<Metadata = ptr::DynMetadata<T>> + ?Sized,
Typ: ListType<T>,
{
type Item = alloc::boxed::Box<T>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|p| unsafe {
let (p, md) = ptr::to_raw_parts_mut::<T>(p);
let layout = md.layout();
let bp = alloc::alloc::alloc(layout);
if bp.is_null() {
alloc::alloc::handle_alloc_error(layout);
}
bp.copy_from_nonoverlapping(p as *const u8, layout.size());
alloc::boxed::Box::from_raw(ptr::from_raw_parts_mut(bp as *mut (), md))
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<T, Typ> ExactSizeIterator for IntoBoxedIter<T, Typ>
where
T: ptr::Pointee<Metadata = ptr::DynMetadata<T>> + ?Sized,
Typ: ListType<T>,
{
}