pub struct UTF32;
impl UTF32 {
const __ENCODING_BYTES: usize = 4_usize;
const fn is_not_utf32(code: u32) -> bool {
return if (code & 0xFFFF0000) == 0x00000000 && (code & 0x0000F800) == 0x0000D800 { true }
else if (code & 0xFFFF0000) > 0x00100000 { true }
else { false };
}
pub const fn is_utf32(array: &[u32], endian: bool) -> bool {
const fn swap_endian(value: u32) -> u32 {
return ((value & 0xFF000000) >> 24)
| ((value & 0x00FF0000) >> 8)
| ((value & 0x0000FF00) << 8)
| ((value & 0x000000FF) << 24);
}
let (mut index, length): (usize, usize) = (0_usize, array.len());
#[cfg(target_endian = "big")]
if endian {
while index < length { if UTF32::is_not_utf32(swap_endian(array[index])) { return false; }; index += 1_usize; }
} else {
while index < length { if UTF32::is_not_utf32(array[index]) { return false; }; index += 1_usize; }
}
#[cfg(target_endian = "little")]
if endian {
while index < length { if UTF32::is_not_utf32(array[index]) { return false; }; index += 1_usize; }
} else {
while index < length { if UTF32::is_not_utf32(swap_endian(array[index])) { return false; }; index += 1_usize; }
}
return true;
}
pub const fn is_utf32_from_byte_array(bytes: &[u8], endian: bool) -> bool {
let length: usize = bytes.len();
return if length == 0 || length % UTF32::__ENCODING_BYTES != 0_usize { false }
else { UTF32::is_utf32(unsafe { std::slice::from_raw_parts::<u32>(bytes.as_ptr() as *const u32, length / UTF32::__ENCODING_BYTES) }, endian) }
}
}