use std::num::NonZero;
use super::constants::{FIELD_SIZE, PRIMITIVE_POLY};
pub const LOG_TABLE: [u8; FIELD_SIZE] = {
let mut log = [0; FIELD_SIZE];
let mut current = 1u16; let mut i: u8 = 0;
while i < 255 {
log[current as usize] = i;
current <<= 1; if current & 0x100 != 0 {
current ^= PRIMITIVE_POLY; }
current &= 0xff; i += 1;
}
log
};
const fn nonzero(val: u8) -> NonZero<u8> {
match NonZero::<u8>::new(val) {
Some(value) => value,
None => nonzero(1),
}
}
pub const ANTILOG_TABLE: [NonZero<u8>; FIELD_SIZE] = {
let mut antilog = [nonzero(1); FIELD_SIZE];
let mut current = 1u16; let mut i = 0;
while i < 255 {
antilog[i] = nonzero((current & 0xff) as u8);
current <<= 1;
if current & 0x100 != 0 {
current ^= PRIMITIVE_POLY;
}
i += 1;
}
antilog
};
#[cfg(test)]
mod tests {
use super::ANTILOG_TABLE;
#[test]
fn antilog_nonzero() {
for n in &ANTILOG_TABLE {
assert_ne!(n.get(), 0);
}
}
}