trait-obj-list 0.1.2

List of unsized trait objects, stored in a flat array
Documentation
use crate::iters::IntoPtrsIter;
use crate::ptr;
use crate::types::ListType;

/// Iterator that consumes a [`DynList`](crate::DynList) and returns its elements
/// moved into boxes.
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>,
{
}