docchi_compaction/enc_dec/
reader.rs1use 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}