tachyon/tachyon/
int_buffer.rs

1pub struct IntBuffer {
2    pub index: usize,
3}
4
5impl IntBuffer {
6    pub fn write_u32(&mut self, v: u32, data: &mut [u8]) {
7        data[self.index] = v as u8;
8        self.index += 1;
9        data[self.index] = (v >> 8) as u8;
10        self.index += 1;
11        data[self.index] = (v >> 16) as u8;
12        self.index += 1;
13        data[self.index] = (v >> 24) as u8;
14        self.index += 1;
15    }
16
17    pub fn read_u32(&mut self, data: &[u8]) -> u32 {
18        let value = (data[self.index] as u32)
19            | (data[self.index + 1] as u32) << 8
20            | (data[self.index + 2] as u32) << 16
21            | (data[self.index + 3] as u32) << 24;
22        self.index += 4;
23        return value;
24    }
25
26    pub fn write_u16(&mut self, v: u16, data: &mut [u8]) {
27        data[self.index] = v as u8;
28        self.index += 1;
29        data[self.index] = (v >> 8) as u8;
30        self.index += 1;
31    }
32
33    pub fn read_u16(&mut self, data: &[u8]) -> u16 {
34        let value = (data[self.index] as u16) | (data[self.index + 1] as u16) << 8;
35        self.index += 2;
36        return value;
37    }
38
39    pub fn write_u8(&mut self, v: u8, data: &mut [u8]) {
40        data[self.index] = v;
41        self.index += 1;
42    }
43
44    pub fn read_u8(&mut self, data: &[u8]) -> u8 {
45        let value = data[self.index];
46        self.index += 1;
47        return value;
48    }
49
50    pub fn u4_to_u8(v1: u8, v2: u8) -> u8 {
51        return v1 | v2 << 4;
52    }
53
54    pub fn u8_to_u4(byte: u8) -> (u8,u8) {
55        return (byte & 0x0F,  byte >> 4);
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use crate::tachyon::int_buffer::IntBuffer;
62
63    #[test]
64    fn test_4bit() {
65        let mut low = 3;
66        let mut high = 15;
67        let byte = IntBuffer::u4_to_u8(low, high);
68        let res = IntBuffer::u8_to_u4(byte);
69        low = res.0;
70        high = res.1;
71
72        println!("{0}", byte);
73        println!("{0} {1}", low, high);
74    }
75
76    #[test]
77    fn test_header_readwrite() {
78        let mut bytes: Vec<u8> = vec![0; 128];
79
80        let mut buffer = IntBuffer { index: 0 };
81        buffer.write_u32(234, &mut bytes);
82        buffer.write_u16(44, &mut bytes);
83        buffer.write_u8(99, &mut bytes);
84        buffer.write_u32(1, &mut bytes);
85        buffer.index = 0;
86        assert_eq!(234, buffer.read_u32(&bytes));
87        assert_eq!(44, buffer.read_u16(&bytes));
88        assert_eq!(99, buffer.read_u8(&bytes));
89        assert_eq!(1, buffer.read_u32(&bytes));
90        return;
91    }
92}