use alloc::vec;
use alloc::vec::Vec;
use crate::arithmetic_decoder::{ArithmeticDecoder, ArithmeticDecoderContext};
pub(crate) struct SymbolIdDecoder {
contexts: Vec<ArithmeticDecoderContext>,
code_len: u32,
}
impl SymbolIdDecoder {
pub(crate) fn new(code_len: u32) -> Self {
let num_contexts = 1_usize << code_len;
Self {
contexts: vec![ArithmeticDecoderContext::default(); num_contexts],
code_len,
}
}
#[inline(always)]
pub(crate) fn decode(&mut self, decoder: &mut ArithmeticDecoder<'_>) -> u32 {
let mut prev = 1_u32;
for _ in 0..self.code_len {
let d = decoder.read_bit(&mut self.contexts[prev as usize]);
prev = (prev << 1) | d;
}
prev -= 1 << self.code_len;
prev
}
}