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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
mod node; // mod result_src; mod table; mod tree; pub(self) use node::Node; pub(self) use table::Table; pub(self) use tree::Tree; /// Decompresses byte vector /// /// # Examples /// /// ``` /// use bpack::{pack, unpack}; /// /// let data = "some very long string".as_bytes(); /// /// if let Some(packed) = pack(data) { /// let unpacked = unpack(packed); /// /// assert_eq!(data, unpacked.as_slice()); /// } /// /// # Panics /// if passed data is not a byte vector returned from `pack` /// function /// ``` pub fn unpack(packed: Vec<u8>) -> Vec<u8> { let (first, second) = (packed[0], packed[1]); let original_size = (((first as u16) << 8) | second as u16) as usize; let topo: Vec<u8> = packed[2..121].to_vec(); let tree = Tree::from_topo(topo); let mut table = Table::new(); tree.dfs(&mut table); let mut result = vec![0; original_size]; let mut idx = 0; for i in 121..packed.len() { table.handle(packed[i], &mut result, &mut idx, original_size); } result } // #[cfg(test)] // mod test { // use result_src::{result_, src_}; // use super::*; // use std::time::{Instant}; // #[test] // #[ignore] // fn unpack_test() { // let packed = result_(); // let src = src_(); // println!("src -> {}", src.len()); // let before = Instant::now(); // let a = unpack(packed); // let after = Instant::now(); // // println!("result -> {:?}", a); // assert_eq!(a, src); // for i in 0..a.len() { // if a[i] != src[i] { // println!("idx -> {} a_val -> {}, src_val -> {}", i, a[i], src[i]); // } // } // println!("time taken => {:?}", after - before); // assert_eq!(1, 2); // } // }