use crate::vtable::SequenceString;
use crate::{JsStr, JsStringKind};
use std::alloc::Layout;
mod sealed {
pub trait Sealed {}
}
#[allow(private_interfaces)]
pub(crate) trait InternalStringType: StringType {
const DATA_OFFSET: usize;
const KIND: JsStringKind;
fn base_layout() -> Layout;
fn str_ctor(slice: &[Self::Byte]) -> JsStr<'_>;
}
pub trait StringType: sealed::Sealed {
type Byte: Copy + Eq + 'static;
}
#[allow(missing_copy_implementations)]
#[derive(Debug)]
pub enum Latin1 {}
impl sealed::Sealed for Latin1 {}
impl StringType for Latin1 {
type Byte = u8;
}
impl InternalStringType for Latin1 {
const DATA_OFFSET: usize = size_of::<SequenceString<Self>>();
const KIND: JsStringKind = JsStringKind::Latin1Sequence;
fn base_layout() -> Layout {
Layout::new::<SequenceString<Self>>()
}
fn str_ctor(slice: &[Self::Byte]) -> JsStr<'_> {
JsStr::latin1(slice)
}
}
#[allow(missing_copy_implementations)]
#[derive(Debug)]
pub enum Utf16 {}
impl sealed::Sealed for Utf16 {}
impl StringType for Utf16 {
type Byte = u16;
}
impl InternalStringType for Utf16 {
const DATA_OFFSET: usize = size_of::<SequenceString<Self>>();
const KIND: JsStringKind = JsStringKind::Utf16Sequence;
fn base_layout() -> Layout {
Layout::new::<SequenceString<Self>>()
}
fn str_ctor(slice: &[Self::Byte]) -> JsStr<'_> {
JsStr::utf16(slice)
}
}