const INVALID_VALUE: u8 = 0x80;
const SPACE_VALUE: u8 = 0x40;
use crate::lut_align64::CacheLineLut;
static LUT1: CacheLineLut = CacheLineLut([
INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, SPACE_VALUE, SPACE_VALUE, INVALID_VALUE, SPACE_VALUE, SPACE_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, SPACE_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, 62, INVALID_VALUE, 62, INVALID_VALUE, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, ]);
static LUT2: CacheLineLut = CacheLineLut([
INVALID_VALUE, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, 63, INVALID_VALUE, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, ]);
fn decode64(b: u8) -> (u8, bool, bool) {
let idx = (b % 64) as usize;
let mask = (-(((b & 0xc0) == 0x40) as bool as i8)) as u8;
let looked_up = ((!mask) & LUT1.0[idx]) | (mask & LUT2.0[idx]);
(
looked_up,
((b | looked_up) as i8).is_negative(),
(looked_up & SPACE_VALUE) == SPACE_VALUE,
)
}
#[derive(Copy, Clone)]
pub(super) struct LutAlign64;
impl super::Decoder for LutAlign64 {
type Block = [u8; 1];
#[inline]
fn decode_block(self, block: &mut Self::Block) -> super::BlockResult {
let (a, invalid, space) = decode64(block[0]);
block[0] = a;
super::BlockResult {
out_length: if space | invalid { 0 } else { 1 },
first_invalid: if invalid { Some(0) } else { None },
}
}
#[inline(always)]
fn zero_block() -> Self::Block {
[b' '; 1]
}
}