use core::iter::FusedIterator;
use rootcause_internals::RawAttachment;
use crate::{
markers::Dynamic,
report_attachment::{ReportAttachment, ReportAttachmentMut, ReportAttachmentRef},
};
#[must_use]
pub struct ReportAttachmentsIter<'a> {
raw: core::slice::Iter<'a, RawAttachment>,
}
impl<'a> ReportAttachmentsIter<'a> {
pub(crate) fn from_raw(raw: core::slice::Iter<'a, RawAttachment>) -> Self {
Self { raw }
}
}
impl<'a> Iterator for ReportAttachmentsIter<'a> {
type Item = ReportAttachmentRef<'a, Dynamic>;
fn next(&mut self) -> Option<Self::Item> {
let raw = self.raw.next()?.as_ref();
let attachment = unsafe {
ReportAttachmentRef::<'a, Dynamic>::from_raw(raw)
};
Some(attachment)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.raw.size_hint()
}
}
impl<'a> DoubleEndedIterator for ReportAttachmentsIter<'a> {
fn next_back(&mut self) -> Option<Self::Item> {
let raw = self.raw.next_back()?.as_ref();
let attachment = unsafe {
ReportAttachmentRef::<'a, Dynamic>::from_raw(raw)
};
Some(attachment)
}
}
impl<'a> ExactSizeIterator for ReportAttachmentsIter<'a> {
fn len(&self) -> usize {
self.raw.len()
}
}
impl<'a> FusedIterator for ReportAttachmentsIter<'a> {}
#[must_use]
pub struct ReportAttachmentsIterMut<'a> {
raw: core::slice::IterMut<'a, RawAttachment>,
}
impl<'a> ReportAttachmentsIterMut<'a> {
pub(crate) fn from_raw(raw: core::slice::IterMut<'a, RawAttachment>) -> Self {
Self { raw }
}
}
impl<'a> Iterator for ReportAttachmentsIterMut<'a> {
type Item = ReportAttachmentMut<'a, Dynamic>;
fn next(&mut self) -> Option<Self::Item> {
let raw = self.raw.next()?.as_mut();
let attachment = unsafe {
ReportAttachmentMut::<'a, Dynamic>::from_raw(raw)
};
Some(attachment)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.raw.size_hint()
}
}
impl<'a> DoubleEndedIterator for ReportAttachmentsIterMut<'a> {
fn next_back(&mut self) -> Option<Self::Item> {
let raw = self.raw.next_back()?.as_mut();
let attachment = unsafe {
ReportAttachmentMut::<'a, Dynamic>::from_raw(raw)
};
Some(attachment)
}
}
impl<'a> ExactSizeIterator for ReportAttachmentsIterMut<'a> {
fn len(&self) -> usize {
self.raw.len()
}
}
impl<'a> FusedIterator for ReportAttachmentsIterMut<'a> {}
mod limit_field_access {
use core::marker::PhantomData;
use rootcause_internals::RawAttachment;
#[must_use]
pub struct ReportAttachmentsIntoIter<ThreadMarker: 'static> {
raw: alloc::vec::IntoIter<RawAttachment>,
_thread_safety: PhantomData<ThreadMarker>,
}
impl<T> ReportAttachmentsIntoIter<T> {
pub(crate) unsafe fn from_raw(raw: alloc::vec::IntoIter<RawAttachment>) -> Self {
Self {
raw,
_thread_safety: PhantomData,
}
}
pub(crate) fn as_raw(&self) -> &alloc::vec::IntoIter<RawAttachment> {
&self.raw
}
pub(crate) unsafe fn as_raw_mut(&mut self) -> &mut alloc::vec::IntoIter<RawAttachment> {
&mut self.raw
}
}
}
pub use limit_field_access::ReportAttachmentsIntoIter;
impl<T> Iterator for ReportAttachmentsIntoIter<T> {
type Item = ReportAttachment<Dynamic, T>;
fn next(&mut self) -> Option<Self::Item> {
let raw = unsafe { self.as_raw_mut() };
let attachment = raw.next()?;
let attachment = unsafe { ReportAttachment::<Dynamic, T>::from_raw(attachment) };
Some(attachment)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.as_raw().size_hint()
}
}
impl<T> DoubleEndedIterator for ReportAttachmentsIntoIter<T> {
fn next_back(&mut self) -> Option<Self::Item> {
let raw = unsafe { self.as_raw_mut() };
let attachment = raw.next_back()?;
let attachment = unsafe { ReportAttachment::<Dynamic, T>::from_raw(attachment) };
Some(attachment)
}
}
impl<T> ExactSizeIterator for ReportAttachmentsIntoIter<T> {
fn len(&self) -> usize {
self.as_raw().len()
}
}
impl<T> FusedIterator for ReportAttachmentsIntoIter<T> {}
impl<T> Unpin for ReportAttachmentsIntoIter<T> {}