aboutsummaryrefslogtreecommitdiff
path: root/src/conversion.rs
blob: 857b1c183f5c895aca21aa97732998313771af1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::collections::HashMap;

use super::bits::BitSet;
use super::tree::Tree;

pub struct Table(pub HashMap<u8, BitSet>);

impl Table {
    pub fn new() -> Table {
        Table(HashMap::new())
    }

    pub fn from_tree(tree: &Tree) -> Table {
        Table(tree.to_hash_map())
    }

    pub fn convert(&self, data: Vec<u8>) -> Vec<u8> {
        let mut bitset = BitSet::new();
        for byte in data {
            bitset.concat(&self.0[&byte]);
        }
        bitset.data
    }

    pub fn serialize(&self) -> Vec<u8> {
        let mut out: Vec<u8> = Vec::new();
        let size: u32 = self.0.iter()
            .fold(0, |acc, (_, v)| acc + 2 + v.data.len() as u32);
        out.push(((size & 0xff000000) >> 24) as u8);
        out.push(((size & 0x00ff0000) >> 16) as u8);
        out.push(((size & 0x0000ff00) >> 8) as u8);
        out.push(((size & 0x000000ff) >> 0) as u8);

        for (k, v) in &self.0 {
            out.push(*k);
            out.push(v.len as u8);
            out.extend(v.data.iter());
        }
        out
    }
}

use std::fmt;

impl fmt::Debug for Table {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        for (k, v) in self.0.iter() {
            write!(f, "{:4} {:?}\n", format!("{:?}", *k as char), v)?;
        }
        Ok(())
    }
}