storage.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use crate::hufftree::canonical::convert_no_to_bit_vec;
  2. use crate::hufftree::canonical::CanonicalHufftree;
  3. use bit_vec::BitVec;
  4. use std::io::Read;
  5. use std::io::Write;
  6. pub fn store_tree<F: Write>(tree: CanonicalHufftree, writer: &mut F) -> Result<(), String> {
  7. let mut buff = BitVec::new();
  8. let mut character_buff: [u8; 4] = [0; 4];
  9. for (character, code) in tree.get_character_codes() {
  10. let code_length: u32 = code.len().try_into().unwrap();
  11. let mut code_length_vec = convert_no_to_bit_vec(code_length);
  12. buff.append(&mut code_length_vec);
  13. buff.append(&mut BitVec::from_elem(8, false));
  14. character.encode_utf8(&mut character_buff);
  15. buff.append(&mut BitVec::from_bytes(&character_buff));
  16. character_buff.fill(0);
  17. }
  18. let buff = buff.to_bytes();
  19. let buff_len: u32 = buff.len().try_into().unwrap();
  20. writer.write_all(&buff_len.to_be_bytes()).unwrap();
  21. writer.write_all(&buff).unwrap();
  22. Ok(())
  23. }
  24. #[cfg(test)]
  25. mod test {
  26. use std::collections::HashMap;
  27. use crate::hufftree::base::Hufftree;
  28. use super::*;
  29. #[test]
  30. fn stores_length_and_rest() {
  31. let mut chars_and_freq: HashMap<char, i32> = HashMap::new();
  32. chars_and_freq.insert('a', 25);
  33. chars_and_freq.insert('b', 14);
  34. chars_and_freq.insert('c', 5);
  35. let huff = Hufftree::new(chars_and_freq);
  36. let canonical = CanonicalHufftree::from_tree(huff);
  37. let mut virtual_buffer = Vec::new();
  38. store_tree(canonical, &mut virtual_buffer).unwrap();
  39. println!("Buffer:{:?}", virtual_buffer);
  40. }
  41. }