use super::inner::utf16;
use core::hash::{
Hash,
Hasher,
};
use crate::{
ByteOrder,
Charset,
CharsetCodec,
CharsetDecodeResult,
CharsetEncodeResult,
DecodeStatus,
Utf16,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Utf16ByteCodec {
byte_order: ByteOrder,
}
impl Hash for Utf16ByteCodec {
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
self.charset().hash(state);
}
}
impl Utf16ByteCodec {
#[must_use]
#[inline]
pub const fn new(byte_order: ByteOrder) -> Self {
Self { byte_order }
}
#[must_use]
#[inline]
pub const fn byte_order(self) -> ByteOrder {
self.byte_order
}
#[must_use]
#[inline]
pub const fn charset(self) -> Charset {
Charset::from_utf16_byte_order(self.byte_order)
}
#[must_use]
#[inline]
pub const fn max_units_per_char(self) -> usize {
Utf16::MAX_BYTES_PER_CHAR
}
}
impl CharsetCodec for Utf16ByteCodec {
type Unit = u8;
#[inline]
fn charset(&self) -> Charset {
Charset::from_utf16_byte_order(self.byte_order)
}
#[inline]
fn max_units_per_char(&self) -> usize {
Utf16::MAX_BYTES_PER_CHAR
}
fn decode_one(&self, input: &[u8], index: usize) -> CharsetDecodeResult<DecodeStatus> {
utf16::decode_bytes_prefix(input, index, self.byte_order)
}
fn encode_one(&self, ch: char, output: &mut [u8], index: usize) -> CharsetEncodeResult<usize> {
utf16::encode_bytes_char(ch, output, self.byte_order, index)
}
}