docchi_compaction/enc_dec/
reader.rs

1use std::io::Read;
2use with_capacity_safe::vec_with_capacity_safe;
3use crate::error::ComResult;
4
5pub(crate) struct Reader<'a, T : Read>{
6    read : &'a mut T,
7    buf : Vec<u8>,
8    len : usize,
9}
10
11impl<'a, T : Read> Reader<'a, T>{
12    pub(crate) fn new(read : &'a mut T) -> Self{ Self{ read, buf : Vec::new(), len : 0 } }
13    pub(crate) fn read_byte(&mut self) -> ComResult<u8>{
14        let mut buf = [0u8; 1];
15        self.read.read_exact(&mut buf)?;
16        self.len += 1;
17        Ok(buf[0])
18    }
19    pub(crate) fn read(&mut self, bytes : usize) -> ComResult<&[u8]>{
20        self.set_buf_len(bytes);
21        self.read.read_exact(&mut self.buf)?;
22        self.len += self.buf.len();
23        Ok(&self.buf)
24    }
25    pub(crate) fn read_string(&mut self, bytes : usize) -> ComResult<String>{
26        let mut buf : Vec<u8> = vec_with_capacity_safe(bytes)?;
27        unsafe{ buf.set_len(bytes); }
28        self.read.read_exact(&mut buf)?;
29        self.len += buf.len();
30        Ok(String::from_utf8(buf)?)
31    }
32    pub(crate) fn read_binary(&mut self, bytes : usize) -> ComResult<Vec<u8>>{
33        let mut buf : Vec<u8> = vec_with_capacity_safe(bytes)?;
34        unsafe{ buf.set_len(bytes); }
35        self.read.read_exact(&mut buf)?;
36        self.len += buf.len();
37        Ok(buf)
38    }
39    pub(crate) fn read_binary8(&mut self, len : usize) -> ComResult<Vec<u64>>{
40        let mut buf : Vec<u64> = vec_with_capacity_safe(len)?;
41        let mut temp = [0u8; 8];
42        for _ in 0..len{
43            self.read.read_exact(&mut temp)?;
44            self.len += 8;
45            buf.push(u64::from_le_bytes(temp));
46        }
47        Ok(buf)
48    }
49    pub(crate) fn read_binary4(&mut self, len : usize) -> ComResult<Vec<u32>>{
50        let mut buf : Vec<u32> = vec_with_capacity_safe(len)?;
51        let mut temp = [0u8; 4];
52        for _ in 0..len{
53            self.read.read_exact(&mut temp)?;
54            self.len += 4;
55            buf.push(u32::from_le_bytes(temp));
56        }
57        Ok(buf)
58    }
59    pub(crate) fn read_binary2(&mut self, len : usize) -> ComResult<Vec<u16>>{
60        let mut buf : Vec<u16> = vec_with_capacity_safe(len)?;
61        let mut temp = [0u8; 2];
62        for _ in 0..len{
63            self.read.read_exact(&mut temp)?;
64            self.len += 2;
65            buf.push(u16::from_le_bytes(temp));
66        }
67        Ok(buf)
68    }
69
70    pub(crate) fn bytes_read(&self) -> usize{ self.len }
71
72    fn set_buf_len(&mut self, len : usize){
73        let capacity = self.buf.capacity();
74        if len <= capacity{
75            unsafe{ self.buf.set_len(len) }
76        } else{
77            self.buf.reserve(len - self.buf.len());
78            unsafe{ self.buf.set_len(len); }
79        }
80    }
81}