use alloc::vec::Vec;
use core::{iter::FusedIterator, marker::PhantomData};
use crate::{ReportRef, markers::Dynamic};
#[must_use]
pub struct ReportIter<'a, Ownership: 'static, ThreadSafety: 'static> {
stack: Vec<ReportRef<'a, Dynamic, Ownership, ThreadSafety>>,
_ownership: PhantomData<Ownership>,
_thread_safety: PhantomData<ThreadSafety>,
}
impl<'a, O, T> ReportIter<'a, O, T> {
pub(crate) fn from_raw(stack: Vec<ReportRef<'a, Dynamic, O, T>>) -> Self {
Self {
stack,
_ownership: PhantomData,
_thread_safety: PhantomData,
}
}
}
impl<'a, O, T> Iterator for ReportIter<'a, O, T> {
type Item = ReportRef<'a, Dynamic, O, T>;
fn next(&mut self) -> Option<Self::Item> {
let cur: ReportRef<'a, Dynamic, O, T> = self.stack.pop()?;
let new_children = cur
.children()
.iter()
.map(|child_report| {
unsafe {
ReportRef::<Dynamic, O, T>::from_cloneable(child_report)
}
})
.rev();
self.stack.extend(new_children);
Some(cur)
}
}
impl<'a, O, T> FusedIterator for ReportIter<'a, O, T> {}
impl<'a, O, T> Unpin for ReportIter<'a, O, T> {}