parallel_processor/utils/
vec_reader.rs

1use 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}