1#![no_std]
2
3pub struct ByteReader<'a, T: Iterator<Item = &'a u8>>(T);
5
6impl<'a, T> ByteReader<'a, T>
7where
8 T: Iterator<Item = &'a u8>,
9{
10 pub fn new(iter: T) -> ByteReader<'a, T> {
11 ByteReader(iter)
12 }
13
14 pub fn next_u8(&mut self) -> Option<u8> {
15 self.0.next().map(|&x| x)
16 }
17
18 pub fn next_u16(&mut self) -> Option<u16> {
19 let first = self.next_u8()? as u16;
20 let second = self.next_u8()? as u16;
21
22 Some((second << 8) | first)
23 }
24
25 pub fn next_u32(&mut self) -> Option<u32> {
26 let first = self.next_u16()? as u32;
27 let second = self.next_u16()? as u32;
28
29 Some((second << 16) | first)
30 }
31
32 pub fn next_u64(&mut self) -> Option<u64> {
33 let first = self.next_u32()? as u64;
34 let second = self.next_u32()? as u64;
35
36 Some((second << 32) | first)
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use ByteReader;
43
44 #[test]
45 fn consume_slice() {
46 let slice = &[0x45, 0xf6, 0xde, 0x34, 0x98, 0x77];
47 let mut reader = ByteReader::new(slice.iter());
48 assert_eq!(reader.next_u8(), Some(0x45));
49 assert_eq!(reader.next_u32(), Some(0x98_34_de_f6));
50 assert_eq!(reader.next_u16(), None);
51 }
52}