#![allow(dead_code)]
const STATE_TRANS_PACKED: u32 = 32040;
pub(crate) static STATE_TRANS: [[u8; 2]; 4] = [[0, 2], [2, 0], [1, 3], [3, 1]];
#[inline]
pub(crate) fn next_state(state: u8, level: i32) -> u8 {
((STATE_TRANS_PACKED >> (((state as u32) << 2) + (((level & 1) as u32) << 1))) & 3) as u8
}
#[inline]
pub(crate) fn quantizer(state: u8) -> u8 {
state >> 1
}
#[inline]
pub(crate) fn recon_qidx(level: i32, state: u8) -> i32 {
if level == 0 {
return 0; }
let q = (state >> 1) as i32;
2 * level + if level > 0 { -q } else { q }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn packed_matches_explicit_table() {
for state in 0u8..4 {
for parity in 0i32..2 {
let got = next_state(state, parity);
assert_eq!(
got, STATE_TRANS[state as usize][parity as usize],
"state {state} parity {parity}"
);
}
}
}
#[test]
fn quantizer_partitions_states() {
assert_eq!(quantizer(0), 0);
assert_eq!(quantizer(1), 0);
assert_eq!(quantizer(2), 1);
assert_eq!(quantizer(3), 1);
}
#[test]
fn recon_qidx_grid() {
for &s in &[0u8, 1] {
assert_eq!(recon_qidx(3, s), 6);
assert_eq!(recon_qidx(-3, s), -6);
assert_eq!(recon_qidx(0, s), 0);
}
for &s in &[2u8, 3] {
assert_eq!(recon_qidx(3, s), 5); assert_eq!(recon_qidx(-3, s), -5); assert_eq!(recon_qidx(1, s), 1); assert_eq!(recon_qidx(0, s), 0);
}
}
#[test]
fn state_walk_is_deterministic_and_bounded() {
let levels = [0i32, 1, 2, -3, 4, 0, 7, -1, 1, 1, 2, 2];
let mut state = 0u8;
let mut trace = Vec::new();
for &l in &levels {
assert!(state < 4);
trace.push(state);
state = next_state(state, l);
}
let mut s2 = 0u8;
for (k, &l) in levels.iter().enumerate() {
assert_eq!(s2, trace[k]);
s2 = next_state(s2, l);
}
}
}