bxl/
lib.rs

1/*
2 *  src/lib.rs - BXL decompression functionality.
3 *  Copyright (C) 2019  Forest Crossman <cyrozap@gmail.com>
4 *
5 *  This program is free software: you can redistribute it and/or modify
6 *  it under the terms of the GNU General Public License as published by
7 *  the Free Software Foundation, either version 3 of the License, or
8 *  (at your option) any later version.
9 *
10 *  This program is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 *  GNU General Public License for more details.
14 *
15 *  You should have received a copy of the GNU General Public License
16 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18
19use 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",
43                "\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                //node.bit_addr.bitlen,
51                child.bit_addr,
52                match child.symbol {
53                    Some(s) => s as i32,
54                    None => -1,
55                },
56                child.weight,
57                //child.bit_addr.bitlen
58            );
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",
68                "\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                //node.bit_addr.bitlen,
76                child.bit_addr,
77                match child.symbol {
78                    Some(s) => s as i32,
79                    None => -1,
80                },
81                child.weight,
82                //child.bit_addr.bitlen
83            );
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        // Special case for root node.
176        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        // Special case for root node.
189        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                //println!("self: {:?}", self);
228                //println!("&parent_addr: {:?}", &parent_addr);
229                self == &parent_addr
230            }
231            Err(_) => false,
232        }
233    }
234
235    fn get_sibling_addr(&self) -> Result<BitAddr, &str> {
236        // Special case for root node.
237        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        // Mask off LSBs.
266        let mask = mask_for_bitlen(old.bitlen);
267        let lsbits = (self.bits & !mask) << old.bitlen;
268
269        // Shift bits and add new prefix.
270        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        /*
308        println!(
309            "increase_weight, self: {}, self.weight: {}->{}, self.symbol: {:?}",
310            self.bit_addr, self.weight, new_weight, self.symbol,
311        );
312        */
313
314        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            //println!("{:?}", err);
358            return false;
359        }
360    };
361    if parent_addr.is_root() {
362        // Parent can't be root because root has no siblings.
363        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    /*
371    println!(
372        "node: {}, node.weight: {}, parent_node: {}, parent_node.weight: {}, node.weight > parent_node.weight: {}",
373        node.bit_addr,
374        node.weight,
375        parent_node.bit_addr,
376        parent_node.weight,
377        node.weight > parent_node.weight
378    );
379    */
380
381    node.weight > parent_node.weight
382}
383
384fn update_tree_at_node(tree: &mut NodeTree, node: &Node) -> Result<(), String> {
385    //println!("update_tree");
386    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    // Collect the child's descendants.
414    let mut c_descendants = NodeTree::new();
415    // Collect the parent's descendants.
416    let mut p_descendants = NodeTree::new();
417    // Collect the parent's sibling's descendants.
418    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    // Remove descendants being moved.
432    for desc in &c_descendants {
433        assert!(tree.remove(&desc));
434    }
435    /*
436    println!(
437        "child_node before removals: {:?}",
438        tree.get(&new_node(child_addr, 0, None))
439    );
440    */
441    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    /*
451    println!(
452        "child_node after removals: {:?}",
453        tree.get(&new_node(child_addr, 0, None))
454    );
455    */
456
457    // Replace P's tree with C's.
458    assert_eq!(child_addr, child_node.bit_addr);
459    for mut desc in c_descendants {
460        //println!("Old c_descendant: {}", desc.bit_addr);
461        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        //println!("New c_descendant: {}", desc.bit_addr);
466        assert!(tree.insert(desc));
467    }
468    /*
469    println!(
470        "child_node before child_node insertion: {:?}",
471        tree.get(&new_node(child_addr, 0, None))
472    );
473    */
474    //println!("Old child_node.bit_addr: {}", child_node.bit_addr);
475    child_node.bit_addr = parent_addr;
476    //println!("New child_node.bit_addr: {}", child_node.bit_addr);
477    assert!(tree.insert(child_node));
478    /*
479    println!(
480        "child_node after child_node insertion: {:?}",
481        tree.get(&new_node(child_addr, 0, None))
482    );
483    */
484    assert_eq!(child_node.bit_addr, parent_addr);
485
486    // Replace PS's tree with P's.
487    assert_eq!(parent_addr, parent_node.bit_addr);
488    for mut desc in p_descendants {
489        //println!("Old p_descendant: {}", desc.bit_addr);
490        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        //println!("New p_descendant: {}", desc.bit_addr);
495        assert!(tree.insert(desc));
496        //tree.replace(desc);
497    }
498    //println!("Old parent_node.bit_addr: {}", parent_node.bit_addr);
499    parent_node.bit_addr = parent_sibling_addr;
500    //println!("New parent_node.bit_addr: {}", parent_node.bit_addr);
501    assert!(tree.insert(parent_node));
502    /*
503    println!(
504        "child_node after parent_node insertion: {:?}",
505        tree.get(&new_node(child_addr, 0, None))
506    );
507    */
508    assert_eq!(parent_node.bit_addr, parent_sibling_addr);
509
510    // Replace C's tree with PS's.
511    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        //println!("Old ps_descendant: {}", desc.bit_addr);
518        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        //println!("New ps_descendant: {}", desc.bit_addr);
526        assert!(tree.insert(desc));
527    }
528    /*
529    println!(
530        "Old parent_sibling_node.bit_addr: {}",
531        parent_sibling_node.bit_addr
532    );
533    */
534    parent_sibling_node.bit_addr = new_child_addr;
535    /*
536    println!(
537        "New parent_sibling_node.bit_addr: {}",
538        parent_sibling_node.bit_addr
539    );
540    println!(
541        "child_node before parent_sibling_node insertion: {:?}",
542        tree.get(&new_node(new_child_addr, 0, None))
543    );
544    */
545    assert!(tree.insert(parent_sibling_node));
546    assert_eq!(parent_sibling_node.bit_addr, new_child_addr);
547
548    // Update parent weights.
549    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    // Update grandparent weights.
589    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    //print_dot(tree);
606
607    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        // The update_tree_at_node() function takes ~7-93 us to run.
614        // Best case number of executions: 0
615        // Best case total delay: 0 ns
616        // Worst case number of executions: > ~7 us
617        // Worst case total delay: > ~650 us
618        let r = update_tree_at_node(tree, &node);
619        match r {
620            Ok(()) => (),
621            //Ok(()) => println!("Updated tree for node {}.", node.bit_addr),
622            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    //println!("Finished updating trees.");
639    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    //print_dot(&tree);
676
677    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 }; // bitlen is 1 because the sequence is padded with a zero bit to start.
680    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        //println!("{}", search_addr);
695        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            //println!("{}", search_addr);
701            decompressed.push(node.symbol.unwrap());
702            node = node.increase_weight();
703            tree.replace(node);
704            //println!("Updating tree for reference node {}.", node.bit_addr);
705            let now = Instant::now();
706            // The update_tree() function on average takes ~800-1400 ns to run.
707            // This function runs for every character in the output file.
708            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    /*
726    println!(
727        "Did {} checks in {} ns.",
728        total_checks,
729        total_check_time.as_nanos()
730    );
731    */
732    //print_dot(&tree);
733
734    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        // Trivial cases.
1070        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        // Equivalence between two BitAddr instances should be determined using the bitlen and the
1086        // masked bits, not just the bitlen and bits.
1087        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}