bzip2_rs/
move_to_front.rs1pub 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}