use crate::wad::{Lump, RawLumpSliceIter, Wad};
use core::iter::FusedIterator;
use oct::IntoOcts;
#[must_use = "iterators are lasy"]
#[derive(Clone, Debug, Default)]
pub struct Lumps<'a> {
buf: &'a [u8],
directory: RawLumpSliceIter<'a>,
}
impl<'a> Lumps<'a> {
pub(in super) fn new(wad: &'a Wad) -> Self {
let buf = wad.as_bytes();
let directory = wad.directory().iter();
Self { buf, directory }
}
#[must_use]
pub fn count_data_len(self) -> usize {
self.map(|Lump { data, .. }| data.len()).sum()
}
#[must_use]
pub fn count_patches(self, name: &str) -> usize {
self.filter(|l| l.raw_name().as_octs() == name.as_bytes()).count()
}
}
impl DoubleEndedIterator for Lumps<'_> {
fn next_back(&mut self) -> Option<Self::Item> {
let raw = self.directory.next_back()?;
let lump = Lump::from_raw(self.buf, raw);
Some(lump)
}
}
impl ExactSizeIterator for Lumps<'_> {}
impl FusedIterator for Lumps<'_> {}
impl<'a> Iterator for Lumps<'a> {
type Item = Lump<'a>;
fn next(&mut self) -> Option<Self::Item> {
let raw = self.directory.next()?;
let lump = Lump::from_raw(self.buf, raw);
Some(lump)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.directory.size_hint()
}
}