21 lines
558 B
Rust
21 lines
558 B
Rust
use std::marker::PhantomData;
|
|
|
|
use crate::ebml::FromEbml;
|
|
|
|
pub struct EbmlIterator<'a, T: FromEbml<'a>>(&'a [u8], PhantomData<fn() -> T>);
|
|
|
|
pub fn ebml_iter<'a, T: FromEbml<'a>>(source: &'a [u8])-> EbmlIterator<'a, T> {
|
|
EbmlIterator(source, PhantomData)
|
|
}
|
|
|
|
impl<'a, T: FromEbml<'a>> Iterator for EbmlIterator<'a, T> {
|
|
type Item = T;
|
|
|
|
fn next(&mut self) -> Option<T> {
|
|
T::decode_element(self.0).unwrap_or(None).and_then(|(element, element_size)| {
|
|
self.0 = &self.0[element_size..];
|
|
Some(element)
|
|
})
|
|
}
|
|
}
|