pub const fn pack_weights(variable: bool, primary: u16, secondary: u16, tertiary: u16) -> u32 {
let upper = (primary as u32) << 16;
let v_int = variable as u16;
let lower = (v_int << 15) | (tertiary << 9) | secondary;
upper | (lower as u32)
}
pub const fn primary(weights: u32) -> u16 {
(weights >> 16) as u16
}
pub const fn secondary(weights: u32) -> u16 {
((weights & 0xFFFF) & 0b1_1111_1111) as u16
}
pub const fn shift_weights(weights: u32, last_variable: &mut bool) -> u32 {
let variable = variability(weights);
let primary = primary(weights);
let tertiary = tertiary(weights);
if variable {
*last_variable = true;
pack_weights(true, primary, 0, 0)
} else if primary == 0 && (tertiary == 0 || *last_variable) {
0
} else {
*last_variable = false;
weights
}
}
pub const fn tertiary(weights: u32) -> u16 {
(((weights & 0xFFFF) >> 9) & 0b11_1111) as u16
}
pub const fn variability(weights: u32) -> bool {
weights & (1 << 15) != 0
}