naia_serde/
bit_reader.rs

1// BitReader
2
3use 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
69// OwnedBitReader
70
71pub 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// BitReaderState
97#[derive(Copy, Clone)]
98struct BitReaderState {
99    scratch: u8,
100    scratch_index: u8,
101    buffer_index: usize,
102}