From 81ae67c934e58ba65c37244ccf21f7cd469ade3e Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 26 Jun 2020 10:17:45 +0200 Subject: Added serialization --- src/conversion.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/conversion.rs (limited to 'src/conversion.rs') 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); + +impl Table { + pub fn from_tree(tree: &Tree) -> Table { + Table(tree.to_hash_map()) + } + + pub fn convert(&self, data: Vec) -> Vec { + let mut bitset = BitSet::new(); + for byte in data { + bitset.concat(&self.0[&byte]); + } + bitset.data + } + + pub fn serialize(&self) -> Vec { + let mut out: Vec = 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(()) + } +} -- cgit