Skip to main content

genio/util/
repeat_bytes.rs

1use Read;
2use void::Void;
3
4/// Reader repeating a sequence of bytes infinitely.
5pub struct RepeatBytes<B> {
6    bytes: B,
7    offset: usize,
8}
9
10impl<B: AsRef<[u8]>> Read for RepeatBytes<B> {
11    type ReadError = Void;
12    
13    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
14        use ::core::cmp::min;
15        let len = buf.len();
16        let bytes = self.bytes.as_ref();
17
18        let amt = min(buf.len(), bytes.len() - self.offset);
19        buf[..amt].copy_from_slice(&bytes[self.offset..(self.offset)]);
20        self.offset += amt;
21        if self.offset == bytes.len() {
22            self.offset = 0
23        }
24
25        let buf = { let tmp = &mut buf[amt..]; tmp };
26
27        for chunk in buf.chunks_mut(bytes.len()) {
28            if chunk.len() != bytes.len() {
29                chunk.copy_from_slice(&bytes[..bytes.len()]);
30                self.offset = chunk.len();
31            } else {
32                chunk.copy_from_slice(bytes);
33            }
34        }
35        Ok(len)
36    }
37}