1use std::collections::HashSet;
20use std::fmt;
21use std::hash::{Hash, Hasher};
22use std::time::{Duration, Instant};
23
24extern crate bit_reverse;
25use bit_reverse::ParallelReverse;
26
27fn mask_for_bitlen(bitlen: u8) -> u64 {
28 if &bitlen == &0 {
29 return 0;
30 }
31
32 !(1u64.overflowing_shl((64 - &bitlen).into()).0 - 1)
33}
34
35type NodeTree = HashSet<Node>;
36
37fn print_node(tree: &NodeTree, node: &Node) {
38 let left_child_addr = node.bit_addr.append_bit(1).unwrap();
39 match tree.get(&new_node(left_child_addr, 0, None)) {
40 Some(child) => {
41 println!(
42 "\t\"{}[{:?}, {}]\"->\"{}[{:?}, {}]\" [label=1]; // left",
44 node.bit_addr,
45 match node.symbol {
46 Some(s) => s as i32,
47 None => -1,
48 },
49 node.weight,
50 child.bit_addr,
52 match child.symbol {
53 Some(s) => s as i32,
54 None => -1,
55 },
56 child.weight,
57 );
59 print_node(tree, child);
60 }
61 None => (),
62 }
63 let right_child_addr = node.bit_addr.append_bit(0).unwrap();
64 match tree.get(&new_node(right_child_addr, 0, None)) {
65 Some(child) => {
66 println!(
67 "\t\"{}[{:?}, {}]\"->\"{}[{:?}, {}]\" [label=0]; // right",
69 node.bit_addr,
70 match node.symbol {
71 Some(s) => s as i32,
72 None => -1,
73 },
74 node.weight,
75 child.bit_addr,
77 match child.symbol {
78 Some(s) => s as i32,
79 None => -1,
80 },
81 child.weight,
82 );
84 print_node(tree, child);
85 }
86 None => (),
87 }
88}
89
90fn print_dot(tree: &NodeTree) {
91 println!("Tree cap: {}", tree.capacity());
92 println!("Tree len: {}", tree.len());
93 println!("digraph NodeTree{{");
94 print_node(tree, &new_node(BitAddr { bits: 0, bitlen: 0 }, 0, None));
95 println!("}}");
96}
97
98#[derive(Copy, Clone, Debug, Eq)]
99struct BitAddr {
100 bits: u64,
101 bitlen: u8,
102}
103
104impl Hash for BitAddr {
105 fn hash<H: Hasher>(&self, state: &mut H) {
106 self.get_masked_bits().hash(state);
107 self.bitlen.hash(state);
108 }
109}
110
111impl PartialEq for BitAddr {
112 fn eq(&self, other: &Self) -> bool {
113 self.bitlen == other.bitlen && self.get_masked_bits() == other.get_masked_bits()
114 }
115}
116
117impl fmt::Display for BitAddr {
118 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
119 let mut bit_vec: Vec<&str> = vec![];
120 for i in 0..self.bitlen {
121 if (self.bits & (1 << (63 - i))) == 0 {
122 bit_vec.push("0");
123 } else {
124 bit_vec.push("1");
125 }
126 }
127 write!(f, "{}", bit_vec.join(""))
128 }
129}
130
131impl BitAddr {
132 fn get_masked_bits(&self) -> u64 {
133 self.bits & mask_for_bitlen(self.bitlen)
134 }
135
136 fn try_from(s: &str) -> Result<BitAddr, String> {
137 let len = s.len();
138 if len > 64 {
139 return Err(format!("Invalid bit string length: {} > 64.", len));
140 }
141 let bitlen = len as u8;
142
143 let mut bits: u64 = 0;
144 let str_bytes = s.as_bytes();
145 for i in 0..len {
146 match str_bytes[i] {
147 b'0' => (),
148 b'1' => bits |= 1 << (63 - i),
149 s => return Err(format!("Invalid bit string: {}", s)),
150 }
151 }
152
153 Ok(BitAddr { bits, bitlen })
154 }
155
156 fn append_bit(&self, bit: u8) -> Result<BitAddr, String> {
157 if self.bitlen >= 64 {
158 return Err(format!("Max bitlen: {}", self.bitlen));
159 }
160
161 let (bits, bitlen) = match bit {
162 0 => (self.bits & !(1 << (63 - self.bitlen)), self.bitlen + 1),
163 1 => (self.bits | 1 << (63 - self.bitlen), self.bitlen + 1),
164 _ => return Err(format!("Invalid bit value \"{}\"--must be 0 or 1.", bit)),
165 };
166
167 Ok(BitAddr { bits, bitlen })
168 }
169
170 fn is_root(&self) -> bool {
171 self.bitlen == 0
172 }
173
174 fn get_last_bit(&self) -> Result<u8, &str> {
175 if self.is_root() {
177 return Err("The root node has no bits.");
178 }
179
180 let last_bit = match (self.bits & (1 << (64 - self.bitlen))) != 0 {
181 false => 0,
182 true => 1,
183 };
184 Ok(last_bit)
185 }
186
187 fn get_parent_addr(&self) -> Result<BitAddr, &str> {
188 if self.is_root() {
190 return Err("The root node has no parents.");
191 }
192
193 let parent_bitlen = self.bitlen - 1;
194 let mask = mask_for_bitlen(parent_bitlen);
195
196 Ok(BitAddr {
197 bits: self.bits & mask,
198 bitlen: parent_bitlen,
199 })
200 }
201
202 fn is_prefix_of(&self, other: BitAddr) -> bool {
203 if self.bitlen > other.bitlen {
204 return false;
205 }
206
207 let mask = mask_for_bitlen(self.bitlen);
208 self.bits == other.bits & mask
209 }
210
211 fn is_ancestor_of(&self, other: BitAddr) -> bool {
212 if self.bitlen >= other.bitlen {
213 return false;
214 }
215
216 let mask = mask_for_bitlen(self.bitlen);
217 self.bits == other.bits & mask
218 }
219
220 fn is_parent_of(&self, other: BitAddr) -> bool {
221 if self.bitlen + 1 != other.bitlen {
222 return false;
223 }
224
225 match other.get_parent_addr() {
226 Ok(parent_addr) => {
227 self == &parent_addr
230 }
231 Err(_) => false,
232 }
233 }
234
235 fn get_sibling_addr(&self) -> Result<BitAddr, &str> {
236 if self.is_root() {
238 return Err("The root node has no siblings.");
239 }
240
241 let sibling_bits = self.bits ^ (1 << (64 - self.bitlen));
242 Ok(BitAddr {
243 bits: sibling_bits,
244 bitlen: self.bitlen,
245 })
246 }
247
248 fn is_left_child(&self) -> Result<bool, String> {
249 match self.get_last_bit() {
250 Ok(0) => Ok(false),
251 Ok(1) => Ok(true),
252 Ok(bit) => Err(format!("Invalid last bit \"{}\".", bit)),
253 Err(err) => Err(err.to_string()),
254 }
255 }
256
257 fn prefix_swap(&self, old: BitAddr, new: BitAddr) -> Result<BitAddr, String> {
258 if !old.is_prefix_of(*self) {
259 return Err(format!(
260 "Old prefix {} does not match the target address {}.",
261 old, self
262 ));
263 }
264
265 let mask = mask_for_bitlen(old.bitlen);
267 let lsbits = (self.bits & !mask) << old.bitlen;
268
269 let bits = new.bits | (lsbits >> new.bitlen);
271 let bitlen = self.bitlen - old.bitlen + new.bitlen;
272
273 Ok(BitAddr { bits, bitlen })
274 }
275}
276
277#[derive(Copy, Clone, Debug, Eq)]
278struct Node {
279 bit_addr: BitAddr,
280 weight: u64,
281 symbol: Option<u8>,
282}
283
284impl Hash for Node {
285 fn hash<H: Hasher>(&self, state: &mut H) {
286 self.bit_addr.hash(state)
287 }
288}
289
290impl PartialEq for Node {
291 fn eq(&self, other: &Self) -> bool {
292 self.bit_addr == other.bit_addr
293 }
294}
295
296impl Node {
297 fn is_leaf(&self) -> bool {
298 match self.symbol {
299 Some(_) => true,
300 None => false,
301 }
302 }
303
304 fn increase_weight(&self) -> Node {
305 let new_weight = self.weight + 1;
306
307 Node {
315 bit_addr: self.bit_addr,
316 weight: new_weight,
317 symbol: self.symbol,
318 }
319 }
320}
321
322fn new_node(bit_addr: BitAddr, weight: u64, symbol: Option<u8>) -> Node {
323 Node {
324 bit_addr,
325 weight,
326 symbol,
327 }
328}
329
330fn initialize_tree() -> NodeTree {
331 let mut tree = NodeTree::with_capacity(511);
332 for symbol in 0..256 {
333 for bitlen in 0..(8 + 1) {
334 let mask = mask_for_bitlen(bitlen);
335 let node_symbol = if bitlen == 8 {
336 Some(symbol as u8)
337 } else {
338 None
339 };
340 tree.insert(new_node(
341 BitAddr {
342 bits: ((symbol as u64) << (64 - 8)) & mask,
343 bitlen: bitlen,
344 },
345 0,
346 node_symbol,
347 ));
348 }
349 }
350 tree
351}
352
353fn node_needs_swap(tree: &NodeTree, node: &Node) -> bool {
354 let parent_addr = match node.bit_addr.get_parent_addr() {
355 Ok(a) => a,
356 Err(err) => {
357 return false;
359 }
360 };
361 if parent_addr.is_root() {
362 return false;
364 }
365 let parent_node = match tree.get(&new_node(parent_addr, 0, None)) {
366 Some(n) => n,
367 None => return false,
368 };
369
370 node.weight > parent_node.weight
382}
383
384fn update_tree_at_node(tree: &mut NodeTree, node: &Node) -> Result<(), String> {
385 let child_addr = node.bit_addr;
387 let mut child_node = match tree.get(node) {
388 Some(n) => n.clone(),
389 None => return Err(format!("Couldn't find child node: {}", child_addr)),
390 };
391 let parent_addr = match child_addr.get_parent_addr() {
392 Ok(addr) => addr,
393 Err(err) => return Err(format!("Couldn't get address of parent: {}", err)),
394 };
395 let mut parent_node = match tree.get(&new_node(parent_addr, 0, None)) {
396 Some(n) => n.clone(),
397 None => return Err(format!("Couldn't find parent node: {}", parent_addr)),
398 };
399 let parent_sibling_addr = match parent_addr.get_sibling_addr() {
400 Ok(addr) => addr,
401 Err(err) => return Err(format!("Couldn't get address of parent sibling: {}", err)),
402 };
403 let mut parent_sibling_node = match tree.get(&new_node(parent_sibling_addr, 0, None)) {
404 Some(n) => n.clone(),
405 None => {
406 return Err(format!(
407 "Couldn't find sibling of parent node: {}",
408 parent_sibling_addr
409 ));
410 }
411 };
412
413 let mut c_descendants = NodeTree::new();
415 let mut p_descendants = NodeTree::new();
417 let mut ps_descendants = NodeTree::new();
419 for tree_node in tree.iter() {
420 if child_addr.is_ancestor_of(tree_node.bit_addr) {
421 assert!(c_descendants.insert(tree_node.clone()));
422 } else if parent_addr.is_ancestor_of(tree_node.bit_addr)
423 && !child_addr.is_prefix_of(tree_node.bit_addr)
424 {
425 assert!(p_descendants.insert(tree_node.clone()));
426 } else if parent_sibling_addr.is_ancestor_of(tree_node.bit_addr) {
427 assert!(ps_descendants.insert(tree_node.clone()));
428 }
429 }
430
431 for desc in &c_descendants {
433 assert!(tree.remove(&desc));
434 }
435 assert!(tree.remove(&child_node));
442 for desc in &p_descendants {
443 assert!(tree.remove(&desc));
444 }
445 assert!(tree.remove(&parent_node));
446 for desc in &ps_descendants {
447 assert!(tree.remove(&desc));
448 }
449 assert!(tree.remove(&parent_sibling_node));
450 assert_eq!(child_addr, child_node.bit_addr);
459 for mut desc in c_descendants {
460 desc.bit_addr = match desc.bit_addr.prefix_swap(child_addr, parent_addr) {
462 Ok(addr) => addr,
463 Err(err) => return Err(format!("Failed to replace P's tree with C's: {}", err)),
464 };
465 assert!(tree.insert(desc));
467 }
468 child_node.bit_addr = parent_addr;
476 assert!(tree.insert(child_node));
478 assert_eq!(child_node.bit_addr, parent_addr);
485
486 assert_eq!(parent_addr, parent_node.bit_addr);
488 for mut desc in p_descendants {
489 desc.bit_addr = match desc.bit_addr.prefix_swap(parent_addr, parent_sibling_addr) {
491 Ok(addr) => addr,
492 Err(err) => return Err(format!("Failed to replace PS's tree with P's: {}", err)),
493 };
494 assert!(tree.insert(desc));
496 }
498 parent_node.bit_addr = parent_sibling_addr;
500 assert!(tree.insert(parent_node));
502 assert_eq!(parent_node.bit_addr, parent_sibling_addr);
509
510 assert_eq!(parent_sibling_addr, parent_sibling_node.bit_addr);
512 let new_child_addr = match child_addr.prefix_swap(parent_addr, parent_sibling_addr) {
513 Ok(addr) => addr,
514 Err(err) => return Err(format!("Failed to get new child address: {}", err)),
515 };
516 for mut desc in ps_descendants {
517 desc.bit_addr = match desc
519 .bit_addr
520 .prefix_swap(parent_sibling_addr, new_child_addr)
521 {
522 Ok(addr) => addr,
523 Err(err) => return Err(format!("Failed to replace C's tree with PS's: {}", err)),
524 };
525 assert!(tree.insert(desc));
527 }
528 parent_sibling_node.bit_addr = new_child_addr;
535 assert!(tree.insert(parent_sibling_node));
546 assert_eq!(parent_sibling_node.bit_addr, new_child_addr);
547
548 let parent_left_child_addr = match parent_node.bit_addr.append_bit(1) {
550 Ok(addr) => addr,
551 Err(err) => {
552 return Err(format!(
553 "Couldn't get address for left child of parent: {}",
554 err
555 ));
556 }
557 };
558 let parent_left_child = match tree.get(&new_node(parent_left_child_addr, 0, None)) {
559 Some(n) => n.clone(),
560 None => {
561 return Err(format!(
562 "Couldn't find left child node: {}",
563 parent_left_child_addr
564 ));
565 }
566 };
567 let parent_right_child_addr = match parent_node.bit_addr.append_bit(0) {
568 Ok(addr) => addr,
569 Err(err) => {
570 return Err(format!(
571 "Couldn't get address for right child of parent: {}",
572 err
573 ));
574 }
575 };
576 let parent_right_child = match tree.get(&new_node(parent_right_child_addr, 0, None)) {
577 Some(n) => n.clone(),
578 None => {
579 return Err(format!(
580 "Couldn't find right child node: {}",
581 parent_right_child_addr
582 ));
583 }
584 };
585 parent_node.weight = parent_left_child.weight + parent_right_child.weight;
586 assert!(tree.replace(parent_node).is_some());
587
588 let grandparent_addr = match parent_node.bit_addr.get_parent_addr() {
590 Ok(addr) => addr,
591 Err(err) => return Err(format!("Couldn't get grandparent address: {}", err)),
592 };
593 let mut grandparent_node = match tree.get(&new_node(grandparent_addr, 0, None)) {
594 Some(n) => n.clone(),
595 None => {
596 return Err(format!(
597 "Couldn't find grandparent node: {}",
598 grandparent_addr
599 ));
600 }
601 };
602 grandparent_node.weight = child_node.weight + parent_node.weight;
603 assert!(tree.replace(grandparent_node).is_some());
604
605 Ok(())
608}
609
610fn update_tree(tree: &mut NodeTree, target: &Node) -> Result<(), String> {
611 let mut node = target.clone();
612 while node_needs_swap(tree, &node) {
613 let r = update_tree_at_node(tree, &node);
619 match r {
620 Ok(()) => (),
621 Err(err) => {
623 return Err(format!(
624 "Failed to update tree at node {}: {}",
625 node.bit_addr, err
626 ));
627 }
628 }
629 match node.bit_addr.get_parent_addr()?.get_parent_addr() {
630 Ok(addr) => node.bit_addr = addr,
631 Err(_) => break,
632 }
633 node = match tree.get(&node) {
634 Some(n) => n.clone(),
635 None => return Err(format!("Couldn't find target node {}.", node.bit_addr)),
636 };
637 }
638 Ok(())
640}
641
642fn get_bit(input: &[u8], bit: usize) -> u8 {
643 let byte = input[bit / 8];
644 if (byte & (1 << (7 - (bit % 8)))) > 0 {
645 1
646 } else {
647 0
648 }
649}
650
651pub fn decompress(input: &[u8]) -> Result<Vec<u8>, String> {
652 if input.len() < 5 {
653 return Err(format!(
654 "Input too short--expected at least 5 bytes, got {} bytes instead.",
655 input.len()
656 ));
657 }
658
659 let u_size = ((input[0] as u32) << 24
660 | (input[1] as u32) << 16
661 | (input[2] as u32) << 8
662 | (input[3] as u32))
663 .swap_bits() as usize;
664 eprintln!("Decompressed size: {}", &u_size);
665
666 let compressed = &input[4..];
667 let c_size = compressed.len();
668 eprintln!("Compressed size: {}", &c_size);
669
670 let num_bits = c_size * 8;
671 eprintln!("Number of bits: {}", num_bits);
672
673 let mut decompressed: Vec<u8> = Vec::with_capacity(u_size);
674 let mut tree = initialize_tree();
675 let mut total_checks = 0;
678 let mut total_check_time = Duration::new(0, 0);
679 let mut search_addr = BitAddr { bits: 0, bitlen: 1 }; for bit in 0..num_bits {
681 if u_size == decompressed.len() {
682 break;
683 }
684
685 let bit_value = get_bit(compressed, bit);
686 if bit_value > 1 {
687 return Err(format!("Bit is neither zero nor one: {}", bit_value));
688 }
689
690 search_addr = match search_addr.append_bit(bit_value) {
691 Ok(addr) => addr,
692 Err(err) => return Err(format!("Failed to append bit to search_addr: {}", err)),
693 };
694 let mut node = match tree.get(&new_node(search_addr, 0, None)) {
696 Some(n) => n.clone(),
697 None => return Err(format!("Node {} does not exist!", search_addr)),
698 };
699 if node.is_leaf() {
700 decompressed.push(node.symbol.unwrap());
702 node = node.increase_weight();
703 tree.replace(node);
704 let now = Instant::now();
706 let r = update_tree(&mut tree, &node);
709 let dur = now.elapsed();
710 total_checks += 1;
711 total_check_time += dur;
712 match r {
713 Ok(()) => (),
714 Err(err) => {
715 return Err(format!(
716 "Failed to update tree for leaf node {}: {}",
717 node.bit_addr, err
718 ));
719 }
720 }
721 assert!(tree.len() == 511);
722 search_addr = BitAddr { bits: 0, bitlen: 0 };
723 }
724 }
725 assert_eq!(u_size, decompressed.len());
735
736 Ok(decompressed)
737}
738
739#[cfg(test)]
740mod tests {
741 use super::*;
742
743 #[test]
744 fn bitaddr_to_string() {
745 assert_eq!(
746 BitAddr {
747 bits: 1 << 63,
748 bitlen: 1
749 }
750 .to_string(),
751 "1"
752 );
753 assert_eq!(
754 BitAddr {
755 bits: 0,
756 bitlen: 32
757 }
758 .to_string(),
759 "00000000000000000000000000000000"
760 );
761 assert_eq!(
762 BitAddr {
763 bits: 0,
764 bitlen: 64
765 }
766 .to_string(),
767 "0000000000000000000000000000000000000000000000000000000000000000"
768 );
769 assert_eq!(
770 BitAddr {
771 bits: 0xff,
772 bitlen: 64
773 }
774 .to_string(),
775 "0000000000000000000000000000000000000000000000000000000011111111"
776 );
777 }
778
779 #[test]
780 fn bitaddr_from_string() {
781 assert_eq!(BitAddr::try_from(""), Ok(BitAddr { bits: 0, bitlen: 0 }));
782 assert_eq!(
783 BitAddr::try_from("101010"),
784 Ok(BitAddr {
785 bits: 0b101010 << 58,
786 bitlen: 6
787 })
788 );
789 assert_eq!(
790 BitAddr::try_from("0000000000000000000000000000000000000000000000000000000011111111"),
791 Ok(BitAddr {
792 bits: 0xff,
793 bitlen: 64
794 })
795 );
796 }
797
798 #[test]
799 fn bitaddr_append_bit() {
800 assert_eq!(
801 BitAddr {
802 bits: 0,
803 bitlen: 63
804 }
805 .append_bit(0)
806 .unwrap(),
807 BitAddr {
808 bits: 0,
809 bitlen: 64
810 }
811 );
812 assert_eq!(
813 BitAddr {
814 bits: 0,
815 bitlen: 63
816 }
817 .append_bit(1)
818 .unwrap(),
819 BitAddr {
820 bits: 1,
821 bitlen: 64
822 }
823 );
824 assert_eq!(
825 BitAddr::try_from("").unwrap().append_bit(0).unwrap(),
826 BitAddr::try_from("0").unwrap()
827 );
828 assert_eq!(
829 BitAddr::try_from("").unwrap().append_bit(1).unwrap(),
830 BitAddr::try_from("1").unwrap()
831 );
832 assert_eq!(
833 BitAddr::try_from("101010").unwrap().append_bit(1).unwrap(),
834 BitAddr::try_from("1010101").unwrap()
835 );
836 }
837
838 #[test]
839 fn bitaddr_append_bit_err() {
840 assert!(BitAddr { bits: 0, bitlen: 0 }.append_bit(2).is_err());
841 assert!(BitAddr {
842 bits: 0,
843 bitlen: 64
844 }
845 .append_bit(0)
846 .is_err());
847 }
848
849 #[test]
850 fn bitaddr_get_last_bit() {
851 assert_eq!(BitAddr::try_from("0").unwrap().get_last_bit().unwrap(), 0);
852 assert_eq!(BitAddr::try_from("1").unwrap().get_last_bit().unwrap(), 1);
853 assert_eq!(
854 BitAddr::try_from("0101010010101010110100101000")
855 .unwrap()
856 .get_last_bit()
857 .unwrap(),
858 0
859 );
860 assert_eq!(
861 BitAddr::try_from("0101010010101010110100101001")
862 .unwrap()
863 .get_last_bit()
864 .unwrap(),
865 1
866 );
867 assert_eq!(
868 BitAddr::try_from("111111010101100110")
869 .unwrap()
870 .get_last_bit()
871 .unwrap(),
872 0
873 );
874 assert_eq!(
875 BitAddr::try_from("111111010101100111")
876 .unwrap()
877 .get_last_bit()
878 .unwrap(),
879 1
880 );
881 }
882
883 #[test]
884 fn bitaddr_is_left_child() {
885 assert_eq!(
886 BitAddr::try_from("0").unwrap().is_left_child().unwrap(),
887 false
888 );
889 assert_eq!(
890 BitAddr::try_from("1").unwrap().is_left_child().unwrap(),
891 true
892 );
893 assert_eq!(
894 BitAddr::try_from("0101010010101010110100101000")
895 .unwrap()
896 .is_left_child()
897 .unwrap(),
898 false
899 );
900 assert_eq!(
901 BitAddr::try_from("0101010010101010110100101001")
902 .unwrap()
903 .is_left_child()
904 .unwrap(),
905 true
906 );
907 assert_eq!(
908 BitAddr::try_from("111111010101100110")
909 .unwrap()
910 .is_left_child()
911 .unwrap(),
912 false
913 );
914 assert_eq!(
915 BitAddr::try_from("111111010101100111")
916 .unwrap()
917 .is_left_child()
918 .unwrap(),
919 true
920 );
921 }
922
923 #[test]
924 fn bitaddr_get_parent_addr() {
925 assert_eq!(
926 BitAddr::try_from("0").unwrap().get_parent_addr().unwrap(),
927 BitAddr::try_from("").unwrap()
928 );
929 assert_eq!(
930 BitAddr::try_from("1").unwrap().get_parent_addr().unwrap(),
931 BitAddr::try_from("").unwrap()
932 );
933 assert_eq!(
934 BitAddr::try_from("1010100")
935 .unwrap()
936 .get_parent_addr()
937 .unwrap(),
938 BitAddr::try_from("101010").unwrap()
939 );
940 assert_eq!(
941 BitAddr::try_from("1010101")
942 .unwrap()
943 .get_parent_addr()
944 .unwrap(),
945 BitAddr::try_from("101010").unwrap()
946 );
947 }
948
949 #[test]
950 fn bitaddr_is_ancestor_of() {
951 assert!(!BitAddr::try_from("")
952 .unwrap()
953 .is_ancestor_of(BitAddr::try_from("").unwrap()));
954 assert!(!BitAddr::try_from("0")
955 .unwrap()
956 .is_ancestor_of(BitAddr::try_from("0").unwrap()));
957 assert!(BitAddr::try_from("")
958 .unwrap()
959 .is_ancestor_of(BitAddr::try_from("0").unwrap()));
960 assert!(BitAddr::try_from("")
961 .unwrap()
962 .is_ancestor_of(BitAddr::try_from("1").unwrap()));
963 assert!(BitAddr::try_from("101010")
964 .unwrap()
965 .is_ancestor_of(BitAddr::try_from("1010100").unwrap()));
966 assert!(BitAddr::try_from("101010")
967 .unwrap()
968 .is_ancestor_of(BitAddr::try_from("1010101").unwrap()));
969 assert!(BitAddr::try_from("")
970 .unwrap()
971 .is_ancestor_of(BitAddr::try_from("00").unwrap()));
972 assert!(BitAddr::try_from("")
973 .unwrap()
974 .is_ancestor_of(BitAddr::try_from("10").unwrap()));
975 assert!(BitAddr::try_from("101010")
976 .unwrap()
977 .is_ancestor_of(BitAddr::try_from("101010000000").unwrap()));
978 assert!(BitAddr::try_from("101010")
979 .unwrap()
980 .is_ancestor_of(BitAddr::try_from("101010111111").unwrap()));
981 }
982
983 #[test]
984 fn bitaddr_is_parent_of() {
985 assert!(BitAddr::try_from("")
986 .unwrap()
987 .is_parent_of(BitAddr::try_from("0").unwrap()));
988 assert!(BitAddr::try_from("")
989 .unwrap()
990 .is_parent_of(BitAddr::try_from("1").unwrap()));
991 assert!(BitAddr::try_from("101010")
992 .unwrap()
993 .is_parent_of(BitAddr::try_from("1010100").unwrap()));
994 assert!(BitAddr::try_from("101010")
995 .unwrap()
996 .is_parent_of(BitAddr::try_from("1010101").unwrap()));
997 }
998
999 #[test]
1000 fn bitaddr_get_sibling_addr() {
1001 assert_eq!(
1002 BitAddr::try_from("0").unwrap().get_sibling_addr(),
1003 Ok(BitAddr::try_from("1").unwrap())
1004 );
1005 assert_eq!(
1006 BitAddr::try_from("1").unwrap().get_sibling_addr(),
1007 Ok(BitAddr::try_from("0").unwrap())
1008 );
1009 assert_eq!(
1010 BitAddr::try_from("101010").unwrap().get_sibling_addr(),
1011 Ok(BitAddr::try_from("101011").unwrap())
1012 );
1013 assert_eq!(
1014 BitAddr::try_from("101011").unwrap().get_sibling_addr(),
1015 Ok(BitAddr::try_from("101010").unwrap())
1016 );
1017 }
1018
1019 #[test]
1020 fn bitaddr_prefix_swap() {
1021 assert_eq!(
1022 BitAddr::try_from("000").unwrap().prefix_swap(
1023 BitAddr::try_from("00").unwrap(),
1024 BitAddr::try_from("11").unwrap()
1025 ),
1026 Ok(BitAddr::try_from("110").unwrap())
1027 );
1028 assert_eq!(
1029 BitAddr::try_from("111").unwrap().prefix_swap(
1030 BitAddr::try_from("11").unwrap(),
1031 BitAddr::try_from("00").unwrap()
1032 ),
1033 Ok(BitAddr::try_from("001").unwrap())
1034 );
1035 assert_eq!(
1036 BitAddr::try_from("111").unwrap().prefix_swap(
1037 BitAddr::try_from("1").unwrap(),
1038 BitAddr::try_from("000").unwrap()
1039 ),
1040 Ok(BitAddr::try_from("00011").unwrap())
1041 );
1042 assert_eq!(
1043 BitAddr::try_from("000").unwrap().prefix_swap(
1044 BitAddr::try_from("00").unwrap(),
1045 BitAddr::try_from("").unwrap()
1046 ),
1047 Ok(BitAddr::try_from("0").unwrap())
1048 );
1049 assert_eq!(
1050 BitAddr::try_from("").unwrap().prefix_swap(
1051 BitAddr::try_from("").unwrap(),
1052 BitAddr::try_from("0").unwrap()
1053 ),
1054 Ok(BitAddr::try_from("0").unwrap())
1055 );
1056 assert_eq!(
1057 BitAddr::try_from("101010100101010010101010")
1058 .unwrap()
1059 .prefix_swap(
1060 BitAddr::try_from("101010100101").unwrap(),
1061 BitAddr::try_from("01010100101").unwrap()
1062 ),
1063 Ok(BitAddr::try_from("01010100101010010101010").unwrap())
1064 );
1065 }
1066
1067 #[test]
1068 fn bitaddr_check_equivalence() {
1069 assert_eq!(
1071 BitAddr { bits: 0, bitlen: 0 },
1072 BitAddr { bits: 0, bitlen: 0 }
1073 );
1074 assert_eq!(
1075 BitAddr {
1076 bits: 1,
1077 bitlen: 64
1078 },
1079 BitAddr {
1080 bits: 1,
1081 bitlen: 64
1082 }
1083 );
1084
1085 assert_eq!(
1088 BitAddr { bits: 1, bitlen: 0 },
1089 BitAddr { bits: 0, bitlen: 0 }
1090 );
1091 assert_eq!(
1092 BitAddr { bits: 1, bitlen: 0 },
1093 BitAddr { bits: 0, bitlen: 0 }
1094 );
1095 assert_eq!(
1096 BitAddr {
1097 bits: 1,
1098 bitlen: 63
1099 },
1100 BitAddr {
1101 bits: 0,
1102 bitlen: 63
1103 }
1104 );
1105 }
1106
1107 #[test]
1108 fn node_is_leaf() {
1109 assert!(new_node(BitAddr::try_from("").unwrap(), 0, Some(b'A')).is_leaf());
1110 assert!(!new_node(BitAddr::try_from("").unwrap(), 0, None).is_leaf());
1111 assert!(new_node(BitAddr::try_from("101010").unwrap(), 0, Some(b'A')).is_leaf());
1112 assert!(!new_node(BitAddr::try_from("101010").unwrap(), 0, None).is_leaf());
1113 }
1114
1115 #[test]
1116 fn node_increase_weight() {
1117 assert_eq!(
1118 new_node(BitAddr::try_from("").unwrap(), 0, Some(b'A')).increase_weight(),
1119 new_node(BitAddr::try_from("").unwrap(), 1, Some(b'A'))
1120 );
1121 assert_eq!(
1122 new_node(BitAddr::try_from("").unwrap(), 0, None).increase_weight(),
1123 new_node(BitAddr::try_from("").unwrap(), 1, None)
1124 );
1125 assert_eq!(
1126 new_node(BitAddr::try_from("101010").unwrap(), 0, Some(b'A')).increase_weight(),
1127 new_node(BitAddr::try_from("101010").unwrap(), 1, Some(b'A'))
1128 );
1129 assert_eq!(
1130 new_node(BitAddr::try_from("101010").unwrap(), 0, None).increase_weight(),
1131 new_node(BitAddr::try_from("101010").unwrap(), 1, None)
1132 );
1133 }
1134
1135 #[test]
1136 fn node_needs_swap_ok() {
1137 let mut tree = NodeTree::new();
1138 tree.insert(new_node(BitAddr::try_from("").unwrap(), 0, None));
1139 tree.insert(new_node(BitAddr::try_from("0").unwrap(), 10, None));
1140 tree.insert(new_node(BitAddr::try_from("00").unwrap(), 1, None));
1141 tree.insert(new_node(BitAddr::try_from("01").unwrap(), 100, None));
1142 assert_eq!(
1143 node_needs_swap(&tree, &new_node(BitAddr::try_from("").unwrap(), 0, None)),
1144 false
1145 );
1146 assert_eq!(
1147 node_needs_swap(&tree, &new_node(BitAddr::try_from("0").unwrap(), 10, None)),
1148 false
1149 );
1150 assert_eq!(
1151 node_needs_swap(&tree, &new_node(BitAddr::try_from("00").unwrap(), 1, None)),
1152 false
1153 );
1154 assert_eq!(
1155 node_needs_swap(
1156 &tree,
1157 &new_node(BitAddr::try_from("01").unwrap(), 100, None)
1158 ),
1159 true
1160 );
1161 }
1162
1163 #[test]
1164 fn get_bit_ok() {
1165 assert_eq!(get_bit(&[0x80], 0), 1);
1166 assert_eq!(get_bit(&[0x80], 3), 0);
1167 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 0), 1);
1168 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 7), 0);
1169 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 9), 0);
1170 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 15), 1);
1171 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 16), 0);
1172 assert_eq!(get_bit(&[0x80, 0x01, 0x10], 19), 1);
1173 }
1174}