pub type Class = u8;
#[rustfmt::skip]
pub const ASCII_CLASS: [Class; 128] = {
let mut t = [0u8; 128];
t[b'K' as usize] = 1; t[b'Q' as usize] = 1; t[b'C' as usize] = 1;
t[b'G' as usize] = 1; t[b'X' as usize] = 1;
t[b'P' as usize] = 2; t[b'B' as usize] = 2; t[b'T' as usize] = 2;
t[b'D' as usize] = 2;
t[b'F' as usize] = 3; t[b'V' as usize] = 3; t[b'S' as usize] = 3;
t[b'Z' as usize] = 3; t[b'H' as usize] = 3;
t[b'M' as usize] = 4; t[b'N' as usize] = 4;
t[b'L' as usize] = 5; t[b'R' as usize] = 5;
t[b'W' as usize] = 6; t[b'Y' as usize] = 6; t[b'J' as usize] = 6;
t[b'I' as usize] = 7; t[b'U' as usize] = 7;
t[b'A' as usize] = 8; t[b'E' as usize] = 8; t[b'O' as usize] = 8;
t
};
#[inline]
#[must_use]
pub fn class_of(c: char) -> Class {
if (c as u32) < 128 {
return ASCII_CLASS[c as usize];
}
match c {
'ك' | 'ق' | 'غ' | 'خ' => 1,
'ت' | 'د' | 'ط' | 'ض' | 'ث' | 'ذ' | 'ب' => 2,
'ف' | 'س' | 'ش' | 'ص' | 'ز' | 'ظ' | 'ح' | 'ه' | 'ة' => 3,
'م' | 'ن' => 4,
'ل' | 'ر' => 5,
'ج' => 6,
'ا' | 'ى' | 'آ' | 'أ' | 'إ' | 'ع' | 'ء' => 8,
_ => 0,
}
}
#[inline]
#[must_use]
pub fn is_arabic_matres(c: char) -> bool {
matches!(c, 'و' | 'ي')
}
#[inline]
#[must_use]
pub fn is_g_ambiguous(c: char) -> bool {
matches!(c, 'G' | 'ج')
}
#[inline]
#[must_use]
pub fn digraph_class(a: char, b: char) -> Option<Class> {
if (a as u32) >= 128 || (b as u32) >= 128 {
return None;
}
match (a, b) {
('K', 'H') | ('G', 'H') | ('C', 'K') | ('Q', 'U') => Some(1),
('C', 'H') | ('S', 'H') | ('T', 'H') | ('P', 'H') | ('D', 'H') | ('Z', 'H') => Some(3),
_ => None,
}
}
pub const LATIN_PREFIXES: &[&str] = &["AL", "EL", "UL", "AS", "ES"];
pub const ARABIC_PREFIX: [char; 2] = ['ا', 'ل'];
#[inline]
#[must_use]
pub fn is_silent_trailing(c: char) -> bool {
matches!(c, 'H' | 'ه' | 'ة')
}