pub struct Tables {
pub ascii_lo: [u8; 64],
pub ascii_hi: [u8; 64],
pub group_tables: [[[u8; 64]; 4]; 8],
pub fast3_uni: [u8; 512], pub fast3_slot: [u16; 512], pub fast3_mixed: &'static [([u8; 64], [u8; 64])],
pub bmp_rle: &'static [(u16, u8)],
pub astral: &'static [(u32, u8)],
}
impl Tables {
#[inline]
pub fn classify_char(&self, text: &[u8], i: usize) -> u8 {
let b0 = text[i];
if b0 < 0x80 {
return if b0 < 64 {
self.ascii_lo[b0 as usize]
} else {
self.ascii_hi[(b0 - 64) as usize]
};
}
if b0 < 0xE0 {
let cont = text[i + 1] & 0x3F;
return self.group_tables[((b0 >> 2) & 7) as usize][(b0 & 3) as usize][cont as usize];
}
if b0 < 0xF0 {
let b1 = text[i + 1];
let c = (text[i + 2] & 0x3F) as usize;
let block = (b0 - 0xE0) as usize * 32 + ((b1 >> 1) & 0x1F) as usize;
let uni = self.fast3_uni[block];
if uni != 0xFF {
return uni;
}
let (lo, hi) = &self.fast3_mixed[self.fast3_slot[block] as usize];
return if b1 & 1 == 0 { lo[c] } else { hi[c] };
}
let cp = ((b0 as u32 & 0x07) << 18)
| ((text[i + 1] as u32 & 0x3F) << 12)
| ((text[i + 2] as u32 & 0x3F) << 6)
| (text[i + 3] as u32 & 0x3F);
self.astral[self.astral.partition_point(|&(s, _)| s <= cp) - 1].1
}
#[inline]
pub fn bmp_tag(&self, cp: u16) -> u8 {
self.bmp_rle[self.bmp_rle.partition_point(|&(s, _)| s <= cp) - 1].1
}
}