naia_serde/
file_bit_writer.rs

1use crate::BitWrite;
2
3// FileBitWriter
4pub struct FileBitWriter {
5    scratch: u8,
6    scratch_index: u8,
7    buffer: Vec<u8>,
8}
9
10impl FileBitWriter {
11    #[allow(clippy::new_without_default)]
12    pub fn new() -> Self {
13        Self {
14            scratch: 0,
15            scratch_index: 0,
16            buffer: Vec::new(),
17        }
18    }
19
20    fn finalize(&mut self) {
21        if self.scratch_index > 0 {
22            let value = (self.scratch << (8 - self.scratch_index)).reverse_bits();
23            self.buffer.push(value);
24        }
25    }
26
27    pub fn to_bytes(mut self) -> Box<[u8]> {
28        self.finalize();
29        Box::from(self.buffer)
30    }
31
32    pub fn to_vec(mut self) -> Vec<u8> {
33        self.finalize();
34        self.buffer
35    }
36}
37
38impl BitWrite for FileBitWriter {
39    fn write_bit(&mut self, bit: bool) {
40        self.scratch <<= 1;
41
42        if bit {
43            self.scratch |= 1;
44        }
45
46        self.scratch_index += 1;
47
48        if self.scratch_index >= 8 {
49            let value = self.scratch.reverse_bits();
50            self.buffer.push(value);
51            self.scratch_index -= 8;
52            self.scratch = 0;
53        }
54    }
55
56    fn write_byte(&mut self, byte: u8) {
57        let mut temp = byte;
58        for _ in 0..8 {
59            self.write_bit(temp & 1 != 0);
60            temp >>= 1;
61        }
62    }
63
64    fn count_bits(&mut self, _: u32) {
65        panic!("This method should not be called for FileBitWriter!");
66    }
67
68    fn is_counter(&self) -> bool {
69        panic!("This method should not be called for FileBitWriter!");
70    }
71}