aboutsummaryrefslogtreecommitdiff
path: root/src/conversion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/conversion.rs')
-rw-r--r--src/conversion.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/conversion.rs b/src/conversion.rs
new file mode 100644
index 0000000..ad7c320
--- /dev/null
+++ b/src/conversion.rs
@@ -0,0 +1,48 @@
+use std::collections::HashMap;
+
+use super::bits::BitSet;
+use super::tree::Tree;
+
+pub struct Table(pub HashMap<u8, BitSet>);
+
+impl Table {
+ 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(())
+ }
+}