1#![forbid(unsafe_code)]
2
3use crate::bitstream::reader_reverse::ReverseBitReader;
4use crate::error::DecompressError;
5use crate::fse::FseDecodeEntry;
6
7pub struct FseState<'t> {
8 table: &'t [FseDecodeEntry],
9 state: u32,
10}
11
12impl<'t> FseState<'t> {
13 pub fn new(
14 table: &'t [FseDecodeEntry],
15 accuracy_log: u8,
16 reader: &mut ReverseBitReader,
17 ) -> Result<Self, DecompressError> {
18 let state = reader.read_bits(accuracy_log)?;
19 Ok(Self { table, state })
20 }
21
22 #[inline]
23 pub fn symbol(&self) -> u8 {
24 self.table[self.state as usize].symbol
25 }
26
27 #[inline]
28 pub fn num_bits(&self) -> u8 {
29 self.table[self.state as usize].num_bits
30 }
31
32 #[inline]
33 pub fn update_state(&mut self, reader: &mut ReverseBitReader) -> Result<(), DecompressError> {
34 let entry = &self.table[self.state as usize];
35 let bits = reader.read_bits(entry.num_bits)?;
36 self.state = entry.base_line as u32 + bits;
37 Ok(())
38 }
39
40 pub fn state(&self) -> u32 {
41 self.state
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48 use crate::bitstream::writer::BitWriter;
49 use crate::fse::table_builder::build_decode_table_from_default;
50 use crate::fse::{LL_DEFAULT_ACCURACY, LL_DEFAULT_DIST};
51
52 #[test]
53 fn init_and_read_symbol() {
54 let table = build_decode_table_from_default(&LL_DEFAULT_DIST, LL_DEFAULT_ACCURACY);
55
56 let mut w = BitWriter::new();
57 w.write_bits(0, LL_DEFAULT_ACCURACY);
58 w.close_reverse_stream();
59 let data = w.into_bytes();
60
61 let mut reader = ReverseBitReader::new(&data).unwrap();
62 let state = FseState::new(&table, LL_DEFAULT_ACCURACY, &mut reader).unwrap();
63 let sym = state.symbol();
64 assert!(sym <= 35);
65 }
66}