1use crate::SerdeErr;
4
5pub struct BitReader<'b> {
6 state: BitReaderState,
7 buffer: &'b [u8],
8}
9
10impl<'b> BitReader<'b> {
11 pub fn new(buffer: &'b [u8]) -> Self {
12 Self {
13 state: BitReaderState {
14 scratch: 0,
15 scratch_index: 0,
16 buffer_index: 0,
17 },
18 buffer,
19 }
20 }
21
22 pub fn bytes_len(&self) -> usize {
23 self.buffer.len()
24 }
25
26 pub fn to_owned(&self) -> OwnedBitReader {
27 OwnedBitReader {
28 state: self.state,
29 buffer: self.buffer.into(),
30 }
31 }
32
33 pub fn read_bit(&mut self) -> Result<bool, SerdeErr> {
34 if self.state.scratch_index == 0 {
35 if self.state.buffer_index == self.buffer.len() {
36 return Err(SerdeErr);
37 }
38
39 self.state.scratch = self.buffer[self.state.buffer_index];
40
41 self.state.buffer_index += 1;
42 self.state.scratch_index += 8;
43 }
44
45 let value = self.state.scratch & 1;
46
47 self.state.scratch >>= 1;
48
49 self.state.scratch_index -= 1;
50
51 Ok(value != 0)
52 }
53
54 pub(crate) fn read_byte(&mut self) -> Result<u8, SerdeErr> {
55 let mut output = 0;
56 for _ in 0..7 {
57 if self.read_bit()? {
58 output |= 128;
59 }
60 output >>= 1;
61 }
62 if self.read_bit()? {
63 output |= 128;
64 }
65 Ok(output)
66 }
67}
68
69pub struct OwnedBitReader {
72 state: BitReaderState,
73 buffer: Box<[u8]>,
74}
75
76impl OwnedBitReader {
77 pub fn new(buffer: &[u8]) -> Self {
78 Self {
79 state: BitReaderState {
80 scratch: 0,
81 scratch_index: 0,
82 buffer_index: 0,
83 },
84 buffer: buffer.into(),
85 }
86 }
87
88 pub fn borrow(&self) -> BitReader {
89 BitReader {
90 state: self.state,
91 buffer: &self.buffer,
92 }
93 }
94}
95
96#[derive(Copy, Clone)]
98struct BitReaderState {
99 scratch: u8,
100 scratch_index: u8,
101 buffer_index: usize,
102}