use core::marker::PhantomData;
use core::ptr::NonNull;
use allocator_api2::alloc::{Allocator, Global};
use crate::arena_str_macros::{impl_box_utf16_str_extras, impl_utf16_str_accessors, impl_utf16_str_read_traits};
use crate::internal::in_chunk::InLocalChunk;
use crate::strings::RcUtf16Str;
pub struct BoxUtf16Str<A: Allocator + Clone = Global> {
data: InLocalChunk<u16, A>,
_phantom: PhantomData<A>,
}
impl<A: Allocator + Clone> BoxUtf16Str<A> {
#[inline]
pub(crate) const unsafe fn from_raw_data(data: NonNull<u16>) -> Self {
unsafe { Self::from_in_chunk(InLocalChunk::new(data)) }
}
#[inline]
pub(crate) const unsafe fn from_in_chunk(data: InLocalChunk<u16, A>) -> Self {
Self {
data,
_phantom: PhantomData,
}
}
#[inline]
pub(crate) fn from_owned_in_chunk(owned: crate::internal::owned_in_chunk::OwnedInLocalChunk<u16, A>) -> Self {
Self {
data: owned.into_in_chunk(),
_phantom: PhantomData,
}
}
#[inline]
pub(crate) const fn data_ptr(&self) -> NonNull<u16> {
self.data.as_non_null()
}
}
impl_utf16_str_accessors!([<A: Allocator + Clone>], BoxUtf16Str<A>);
impl_utf16_str_read_traits!([<A: Allocator + Clone>], BoxUtf16Str<A>);
impl_box_utf16_str_extras!(BoxUtf16Str, RcUtf16Str);