const PHONES: [u8; LETTERS as usize] = [
0, 0b01001000, 0b00001100, 0b00011000, 0, 0b01000100, 0b00001000, 0b00000100, 1, 0b00000101, 0b00001001, 0b10100000, 0b00000010, 0b00010010, 0, 0b01001001, 0b10101000, 0b10100001, 0b00010100, 0b00011101, 1, 0b01000101, 0b00000000, 0b10000100, 1, 0b10010100, ];
const PHONES_C1: [u8; LETTERS_C1 as usize] = [
PHONES[(b's' - b'a') as usize] ^ 1, 0, 0, 0, 0, 0, 1, 0, PHONES[(b'z' - b'a') as usize] ^ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0b00010101, 0b00010111, 0, 0, 0, 0, 1, !0, 1, 1, 1, 1, 1, 1, 0b00010101, 1, ];
const INJECTIVE_PHONES: [u8; LETTERS as usize] = [
0b10000100, 0b00100100, 0b00000110, 0b00001100, 0b11011000, 0b00100010, 0b00000100, 0b00000010, 0b11111000, 0b00000011, 0b00000101, 0b01010000, 0b00000001, 0b00001001, 0b10010100, 0b00100101, 0b01010100, 0b01010001, 0b00001010, 0b00001110, 0b11100000, 0b00100011, 0b00000000, 0b01000010, 0b11100100, 0b01001010, ];
const INJECTIVE_PHONES_C1: [u8; LETTERS_C1 as usize] = [
INJECTIVE_PHONES[(b's' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'a' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'a' - b'a') as usize] ^ 1, 0b10000000, 0b10000110, 0b10100110, 0b11000010, 0b10100111, 0b01010100, INJECTIVE_PHONES[(b'e' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'e' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'e' - b'a') as usize] ^ 1, 0b11000110, INJECTIVE_PHONES[(b'i' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'i' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'i' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'i' - b'a') as usize] ^ 1, 0b00001011, 0b00001011, INJECTIVE_PHONES[(b'o' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'o' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'o' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'o' - b'a') as usize] ^ 1, 0b11011100, !0, 0b11011101, INJECTIVE_PHONES[(b'u' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'u' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'u' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'y' - b'a') as usize] ^ 1, INJECTIVE_PHONES[(b'y' - b'a') as usize] ^ 1, 0b00001011, INJECTIVE_PHONES[(b'y' - b'a') as usize] ^ 1, ];
const LETTERS: u8 = 26;
const LETTERS_C1: u8 = 33;
#[inline(always)]
pub fn map_first(mut x: u8) -> u8 {
x |= 32;
x = x.wrapping_sub(b'a');
if x < LETTERS {
INJECTIVE_PHONES[x as usize]
} else if x >= 0xDF && x < 0xFF {
INJECTIVE_PHONES_C1[(x - 0xDF) as usize]
} else {
0
}
}
#[inline(always)]
pub fn filter(prev: u8, mut x: u8) -> Option<u8> {
x |= 32;
x = x.wrapping_sub(b'a');
x = if x < LETTERS {
PHONES[x as usize]
} else if x >= 0xDF && x < 0xFF {
PHONES_C1[(x - 0xDF) as usize]
} else {
return None;
};
if x & 1 != prev & 1 {
Some(x)
} else { None }
}