#[inline]
pub(crate) fn is_digit(b: u8) -> bool {
b.is_ascii_digit()
}
#[inline]
pub(crate) fn is_vowel(b: u8) -> bool {
matches!(b, b'A' | b'E' | b'I' | b'O' | b'U')
}
#[inline]
pub(crate) fn digit_value(b: u8) -> u32 {
u32::from(b.wrapping_sub(b'0'))
}
#[inline]
pub(crate) fn letter_ordinal(b: u8) -> u32 {
u32::from(b.wrapping_sub(b'A')).wrapping_add(1)
}
#[inline]
pub(crate) fn alnum_value(b: u8) -> u32 {
if is_digit(b) {
digit_value(b)
} else {
letter_ordinal(b).wrapping_add(9)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_digit_classifies() {
assert!(is_digit(b'0'));
assert!(is_digit(b'9'));
assert!(!is_digit(b'A'));
assert!(!is_digit(b'/'));
assert!(!is_digit(b' '));
}
#[test]
fn is_vowel_classifies() {
for v in [b'A', b'E', b'I', b'O', b'U'] {
assert!(is_vowel(v));
}
for c in [b'B', b'C', b'Y', b'Z', b'0'] {
assert!(!is_vowel(c));
}
}
#[test]
fn digit_value_maps() {
assert_eq!(digit_value(b'0'), 0);
assert_eq!(digit_value(b'7'), 7);
assert_eq!(digit_value(b'9'), 9);
}
#[test]
fn letter_ordinal_maps() {
assert_eq!(letter_ordinal(b'A'), 1);
assert_eq!(letter_ordinal(b'B'), 2);
assert_eq!(letter_ordinal(b'Z'), 26);
}
#[test]
fn alnum_value_maps() {
assert_eq!(alnum_value(b'0'), 0);
assert_eq!(alnum_value(b'9'), 9);
assert_eq!(alnum_value(b'A'), 10);
assert_eq!(alnum_value(b'S'), 28);
assert_eq!(alnum_value(b'U'), 30);
assert_eq!(alnum_value(b'Z'), 35);
}
#[test]
fn value_functions_never_panic_on_any_byte() {
for b in 0u8..=255 {
let _ = digit_value(b);
let _ = letter_ordinal(b);
let _ = alnum_value(b);
}
}
}