use core::mem::MaybeUninit;
use super::{letter::Letter, ROTOR_SIZE};
pub type LetterMapping = [Letter; ROTOR_SIZE];
impl core::ops::Index<Letter> for [Letter] {
type Output = Letter;
fn index(&self, index: Letter) -> &Self::Output {
&self[index as u8 as usize]
}
}
impl core::ops::IndexMut<Letter> for [Letter] {
fn index_mut(&mut self, index: Letter) -> &mut Self::Output {
&mut self[index as u8 as usize]
}
}
impl core::ops::Index<Letter> for [MaybeUninit<Letter>] {
type Output = MaybeUninit<Letter>;
fn index(&self, index: Letter) -> &Self::Output {
&self[index as u8 as usize]
}
}
impl core::ops::IndexMut<Letter> for [MaybeUninit<Letter>] {
fn index_mut(&mut self, index: Letter) -> &mut Self::Output {
&mut self[index as u8 as usize]
}
}
#[allow(clippy::cast_possible_truncation)]
pub const UNIT_LETTER_MAP: LetterMapping = {
let mut wiring: [MaybeUninit<Letter>; ROTOR_SIZE] =
unsafe { MaybeUninit::uninit().assume_init() };
let mut i = 0;
while i < ROTOR_SIZE {
wiring[i] = MaybeUninit::new(Letter::const_from_u8(i as u8));
i += 1;
}
unsafe { core::mem::transmute::<_, LetterMapping>(wiring) }
};
#[must_use]
#[allow(clippy::cast_possible_truncation)]
pub const fn string_to_letter_map(string: &'static str) -> LetterMapping {
let mut wiring: [MaybeUninit<Letter>; ROTOR_SIZE] =
unsafe { MaybeUninit::uninit().assume_init() };
let mut i = 0;
while i < ROTOR_SIZE {
wiring[i] = MaybeUninit::new(Letter::const_from_char(string.as_bytes()[i] as char));
i += 1;
}
unsafe { core::mem::transmute::<_, LetterMapping>(wiring) }
}
#[must_use]
#[allow(clippy::cast_possible_truncation)]
pub const fn string_to_inv_letter_map(string: &'static str) -> LetterMapping {
let mut wiring: [MaybeUninit<Letter>; ROTOR_SIZE] =
unsafe { MaybeUninit::uninit().assume_init() };
let mut i = 0;
while i < ROTOR_SIZE {
wiring[Letter::const_from_char(string.as_bytes()[i] as char) as usize] =
MaybeUninit::new(Letter::const_from_u8(i as u8));
i += 1;
}
unsafe { core::mem::transmute::<_, LetterMapping>(wiring) }
}