use crate::{
ByteOrder,
Unicode,
UnicodeBom,
};
pub enum Utf16 {}
impl Utf16 {
pub const MAX_UNITS_PER_CHAR: usize = 2;
pub const MAX_BYTES_PER_CHAR: usize = 4;
#[inline]
pub const fn is_high_surrogate(unit: u16) -> bool {
(unit as u32) >= Unicode::HIGH_SURROGATE_MIN && (unit as u32) <= Unicode::HIGH_SURROGATE_MAX
}
#[inline]
pub const fn is_low_surrogate(unit: u16) -> bool {
(unit as u32) >= Unicode::LOW_SURROGATE_MIN && (unit as u32) <= Unicode::LOW_SURROGATE_MAX
}
#[inline]
pub const fn is_surrogate(unit: u16) -> bool {
(unit as u32) >= Unicode::SURROGATE_MIN && (unit as u32) <= Unicode::SURROGATE_MAX
}
#[inline]
pub const fn is_single_unit(unit: u16) -> bool {
!Self::is_surrogate(unit)
}
#[inline]
pub const fn is_surrogate_pair(high: u16, low: u16) -> bool {
Self::is_high_surrogate(high) && Self::is_low_surrogate(low)
}
#[inline]
pub const fn unit_len(ch: char) -> usize {
if (ch as u32) >= Unicode::SUPPLEMENTARY_MIN {
2
} else {
1
}
}
#[inline]
pub const fn unit_len_code_point(code_point: u32) -> Option<usize> {
if !Unicode::is_scalar_value(code_point) {
None
} else if code_point >= Unicode::SUPPLEMENTARY_MIN {
Some(2)
} else {
Some(1)
}
}
#[inline]
pub const fn compose_pair(high: u16, low: u16) -> Option<u32> {
if Self::is_surrogate_pair(high, low) {
let high_payload = (high as u32) - Unicode::HIGH_SURROGATE_MIN;
let low_payload = (low as u32) - Unicode::LOW_SURROGATE_MIN;
Some((high_payload << 10) + low_payload + Unicode::SUPPLEMENTARY_MIN)
} else {
None
}
}
#[inline]
pub const fn high_surrogate(code_point: u32) -> Option<u16> {
if Unicode::is_supplementary(code_point) {
Some((((code_point - Unicode::SUPPLEMENTARY_MIN) >> 10) + Unicode::HIGH_SURROGATE_MIN) as u16)
} else {
None
}
}
#[inline]
pub const fn low_surrogate(code_point: u32) -> Option<u16> {
if Unicode::is_supplementary(code_point) {
Some((((code_point - Unicode::SUPPLEMENTARY_MIN) & 0x3ff) + Unicode::LOW_SURROGATE_MIN) as u16)
} else {
None
}
}
#[inline]
pub fn detect_bom(bytes: &[u8]) -> Option<ByteOrder> {
match UnicodeBom::detect(bytes) {
Some(UnicodeBom::Utf16BigEndian) => Some(ByteOrder::BigEndian),
Some(UnicodeBom::Utf16LittleEndian) => Some(ByteOrder::LittleEndian),
_ => None,
}
}
}