genio/util/
repeat_bytes.rs1use Read;
2use void::Void;
3
4pub 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}