parallel_processor/utils/
vec_reader.rs1use std::cmp::min;
2use std::io::Read;
3
4pub struct VecReader<R: Read> {
5 vec: Vec<u8>,
6 fill: usize,
7 pos: usize,
8 reader: R,
9 stream_ended: bool,
10}
11
12impl<R: Read> VecReader<R> {
13 pub fn new(capacity: usize, reader: R) -> VecReader<R> {
14 let mut vec = Vec::with_capacity(capacity);
15 unsafe {
16 vec.set_len(capacity);
17 }
18 VecReader {
19 vec,
20 fill: 0,
21 pos: 0,
22 reader,
23 stream_ended: false,
24 }
25 }
26
27 fn update_buffer(&mut self) {
28 self.fill = match self.reader.read(&mut self.vec[..]) {
29 Ok(fill) => fill,
30 Err(_) => 0,
31 };
32 self.stream_ended = self.fill == 0;
33 self.pos = 0;
34 }
35
36 #[inline]
37 pub fn read_bytes(&mut self, slice: &mut [u8]) -> usize {
38 let mut offset = 0;
39
40 while offset < slice.len() {
41 if self.fill == self.pos {
42 self.update_buffer();
43
44 if self.fill == self.pos {
45 return offset;
46 }
47 }
48
49 let amount = min(slice.len() - offset, self.fill - self.pos);
50
51 unsafe {
52 std::ptr::copy(
53 self.vec.as_ptr().add(self.pos),
54 slice.as_mut_ptr().add(offset),
55 amount,
56 );
57 }
58
59 self.pos += amount;
60 offset += amount;
61 }
62 offset
63 }
64
65 pub fn into_inner(self) -> R {
66 self.reader
67 }
68}
69
70impl<R: Read> Read for VecReader<R> {
71 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
72 Ok(self.read_bytes(buf))
73 }
74
75 #[inline(always)]
76 fn read_exact(&mut self, buf: &mut [u8]) -> std::io::Result<()> {
77 let size = self.read_bytes(buf);
78 if size == buf.len() {
79 Ok(())
80 } else {
81 Err(std::io::Error::new(std::io::ErrorKind::UnexpectedEof, ""))
82 }
83 }
84}