bzip2_rs/
move_to_front.rs

1pub struct MoveToFrontDecoder {
2    symbols: [u8; 256],
3}
4
5impl MoveToFrontDecoder {
6    pub fn new() -> Self {
7        let mut this = Self::new_from_symbols([0u8; 256]);
8
9        for (i, symbol) in this.symbols.iter_mut().enumerate() {
10            *symbol = i as u8;
11        }
12
13        this
14    }
15
16    pub fn new_from_symbols(symbols: [u8; 256]) -> Self {
17        Self { symbols }
18    }
19
20    pub fn decode(&mut self, n: u8) -> u8 {
21        let b = self.symbols[usize::from(n)];
22        #[cfg(feature = "rustc_1_37")]
23        self.symbols.copy_within(..usize::from(n), 1);
24        #[cfg(not(feature = "rustc_1_37"))]
25        {
26            let symbols = self.symbols;
27            self.symbols[1..=usize::from(n)].copy_from_slice(&symbols[..usize::from(n)]);
28        }
29        self.symbols[0] = b;
30
31        b
32    }
33
34    pub fn first(&self) -> u8 {
35        self.symbols[0]
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn move_stuff() {
45        let mut decoder = MoveToFrontDecoder::new();
46
47        for i in 0..=255 {
48            assert_eq!(i, usize::from(decoder.symbols[i]));
49        }
50
51        let decode = decoder.decode(0);
52        assert_eq!(decode, 0);
53
54        for i in 0..=255 {
55            assert_eq!(i, usize::from(decoder.symbols[i]));
56        }
57
58        let decode = decoder.decode(5);
59        assert_eq!(decode, 5);
60
61        assert_eq!(decoder.symbols[0], 5);
62        assert_eq!(decoder.symbols[1], 0);
63        assert_eq!(decoder.symbols[2], 1);
64        assert_eq!(decoder.symbols[3], 2);
65        assert_eq!(decoder.symbols[4], 3);
66        assert_eq!(decoder.symbols[5], 4);
67        for i in 6..=255 {
68            assert_eq!(i, usize::from(decoder.symbols[i]));
69        }
70    }
71}