use super::*;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SliceIterator<'a> {
slice: &'a [u8],
}
impl<'a> SliceIterator<'a> {
#[inline]
pub fn new(slice: &'a [u8]) -> SliceIterator<'a> {
SliceIterator { slice }
}
pub fn slice(&self) -> &'a [u8] {
self.slice
}
}
impl<'a> Iterator for SliceIterator<'a> {
type Item = Result<DltPacketSlice<'a>, error::PacketSliceError>;
#[inline]
fn next(&mut self) -> Option<Result<DltPacketSlice<'a>, error::PacketSliceError>> {
if !self.slice.is_empty() {
let result = DltPacketSlice::from_slice(self.slice);
match &result {
Err(_) => {
let len = self.slice.len();
self.slice = &self.slice[len..];
}
Ok(ref value) => {
self.slice = &self.slice[value.slice().len()..];
}
}
Some(result)
} else {
None
}
}
}
#[cfg(test)]
mod slice_interator_tests {
use super::*;
use crate::proptest_generators::*;
use proptest::prelude::*;
#[test]
fn clone_eq() {
let it = SliceIterator { slice: &[] };
assert_eq!(it, it.clone());
}
#[test]
fn debug() {
let it = SliceIterator { slice: &[] };
assert_eq!(
format!("SliceIterator {{ slice: {:?} }}", it.slice),
format!("{:?}", it)
);
}
#[test]
fn slice() {
let buffer: [u8; 4] = [1, 2, 3, 4];
let it = SliceIterator { slice: &buffer };
assert_eq!(it.slice(), &buffer);
}
proptest! {
#[test]
fn iterator(ref packets in prop::collection::vec(dlt_header_with_payload_any(), 1..5)) {
use error::PacketSliceError::*;
let mut buffer = Vec::with_capacity(
(*packets).iter().fold(0, |acc, x| acc + usize::from(x.0.header_len()) + x.1.len())
);
let mut offsets: Vec<(usize, usize)> = Vec::with_capacity(packets.len());
for packet in packets {
let start = buffer.len();
buffer.extend_from_slice(&packet.0.to_bytes());
buffer.extend_from_slice(&packet.1);
offsets.push((start, buffer.len()));
}
let mut expected: Vec<DltPacketSlice<'_>> = Vec::with_capacity(packets.len());
for offset in &offsets {
let slice = &buffer[offset.0..offset.1];
let e = DltPacketSlice::from_slice(slice).unwrap();
assert_eq!(e.slice(), slice);
expected.push(e);
}
assert_eq!(expected, SliceIterator::new(&buffer).map(|x| x.unwrap()).collect::<Vec<DltPacketSlice<'_>>>());
{
let o = offsets.first().unwrap();
let mut it = SliceIterator::new(&buffer[..(o.1 - 1)]);
assert_matches!(it.next(), Some(Err(UnexpectedEndOfSlice(_))));
assert_matches!(it.next(), None);
}
{
let o = offsets.last().unwrap();
let it = SliceIterator::new(&buffer[..(o.1 - 1)]);
let mut it = it.skip(offsets.len()-1);
assert_matches!(it.next(), Some(Err(UnexpectedEndOfSlice(_))));
assert_matches!(it.next(), None);
}
}
}
}