naia_serde/
file_bit_writer.rs1use crate::BitWrite;
2
3pub 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}