use std::borrow::Cow;
use crate::byte_level::BYTE_TO_UTF8;
use crate::byte_level::BYTE_TO_UTF8_LEN;
#[inline]
pub fn normalize(input: &str) -> Cow<'_, str> {
let bytes = input.as_bytes();
#[inline]
fn check_byte(b: &u8) -> bool {
!((b'!'..=b'~').contains(b) || (0xA1..=0xAC).contains(b) || *b >= 0xAE)
}
let needs_encode = bytes.iter().any(check_byte);
if !needs_encode {
return Cow::Borrowed(input);
}
let mut out = Vec::with_capacity(bytes.len() << 1);
for &b in bytes {
let utf8 = BYTE_TO_UTF8[b as usize];
let len = BYTE_TO_UTF8_LEN[b as usize] as usize;
out.extend_from_slice(&utf8[..len]);
}
Cow::Owned(unsafe { String::from_utf8_unchecked(out) })
}