Skip to main content

qrcode_rust_shared/
qr_bit_buffer.rs

1//! QR Code Bit Buffer
2
3pub struct BitBuffer {
4    pub buffer: Vec<i32>,
5    pub length: usize,
6}
7
8impl BitBuffer {
9    pub fn new() -> Self {
10        BitBuffer {
11            buffer: Vec::new(),
12            length: 0,
13        }
14    }
15
16    pub fn put(&mut self, num: i32, length: i32) {
17        for i in (0..length).rev() {
18            self.put_bit(((num >> i) & 1) == 1);
19        }
20    }
21
22    pub fn put_bit(&mut self, bit: bool) {
23        let buf_index = self.length / 8;
24        if self.buffer.len() <= buf_index {
25            self.buffer.push(0);
26        }
27        if bit {
28            self.buffer[buf_index] |= 0x80 >> (self.length % 8);
29        }
30        self.length += 1;
31    }
32}
33
34impl Default for BitBuffer {
35    fn default() -> Self {
36        Self::new()
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_bit_buffer_basic() {
46        let mut buf = BitBuffer::new();
47        buf.put(0x0F, 4); // 1111
48        assert_eq!(buf.length, 4);
49        assert_eq!(buf.buffer[0], 0xF0); // 11110000
50    }
51
52    #[test]
53    fn test_bit_buffer_multiple_bytes() {
54        let mut buf = BitBuffer::new();
55        buf.put(0xFF, 8);
56        buf.put(0x01, 1);
57        assert_eq!(buf.length, 9);
58        assert_eq!(buf.buffer[0], 0xFF);
59        assert_eq!(buf.buffer[1], 0x80);
60    }
61}