use core::marker::PhantomData;
use core::ptr::NonNull;
use allocator_api2::alloc::{Allocator, Global};
use widestring::Utf16Str;
use crate::internal::chunk_ref::ChunkRef;
use crate::strings::utf16_str_common::impl_utf16_str_common;
pub struct ArcUtf16Str<A: Allocator + Clone = Global> {
ptr: NonNull<u16>,
_phantom: PhantomData<(*const Utf16Str, A)>,
}
unsafe impl<A: Allocator + Clone + Send + Sync> Send for ArcUtf16Str<A> {}
unsafe impl<A: Allocator + Clone + Send + Sync> Sync for ArcUtf16Str<A> {}
impl<A: Allocator + Clone> ArcUtf16Str<A> {
#[inline]
pub(crate) unsafe fn from_raw(ptr: NonNull<u16>) -> Self {
Self {
ptr,
_phantom: PhantomData,
}
}
}
impl_utf16_str_common!(ArcUtf16Str);
impl<A: Allocator + Clone> Clone for ArcUtf16Str<A> {
#[inline]
fn clone(&self) -> Self {
let r: ChunkRef<A> = unsafe { ChunkRef::clone_from_value_ptr(self.ptr) };
let _ = r.forget();
Self {
ptr: self.ptr,
_phantom: PhantomData,
}
}
}
impl<A: Allocator + Clone> From<ArcUtf16Str<A>> for crate::Arc<[u16], A> {
#[inline]
fn from(s: ArcUtf16Str<A>) -> Self {
use core::mem::ManuallyDrop;
let me = ManuallyDrop::new(s);
unsafe { Self::from_raw(me.ptr.cast::<u8>()) }
}
}