use core::borrow::BorrowMut;
use core::marker::PhantomData;
use core::ops::DerefMut;
use core::ptr::NonNull;
use core::slice;
use allocator_api2::alloc::{Allocator, Global};
use widestring::Utf16Str;
use crate::strings::utf16_str_common::impl_utf16_str_common;
pub struct BoxUtf16Str<A: Allocator + Clone = Global> {
ptr: NonNull<u16>,
_phantom: PhantomData<(*const Utf16Str, A)>,
}
unsafe impl<A: Allocator + Clone + Send> Send for BoxUtf16Str<A> {}
unsafe impl<A: Allocator + Clone + Sync> Sync for BoxUtf16Str<A> {}
impl<A: Allocator + Clone> BoxUtf16Str<A> {
#[inline]
pub(crate) unsafe fn from_raw(ptr: NonNull<u16>) -> Self {
Self {
ptr,
_phantom: PhantomData,
}
}
#[must_use]
#[inline]
pub fn as_mut_utf16_str(&mut self) -> &mut Utf16Str {
let len = self.u16_len();
unsafe {
let units = slice::from_raw_parts_mut(self.ptr.as_ptr(), len);
Utf16Str::from_slice_unchecked_mut(units)
}
}
}
impl_utf16_str_common!(BoxUtf16Str);
impl<A: Allocator + Clone> DerefMut for BoxUtf16Str<A> {
#[inline]
fn deref_mut(&mut self) -> &mut Utf16Str {
self.as_mut_utf16_str()
}
}
impl<A: Allocator + Clone> AsMut<Utf16Str> for BoxUtf16Str<A> {
#[inline]
fn as_mut(&mut self) -> &mut Utf16Str {
self.as_mut_utf16_str()
}
}
impl<A: Allocator + Clone> BorrowMut<Utf16Str> for BoxUtf16Str<A> {
#[inline]
fn borrow_mut(&mut self) -> &mut Utf16Str {
self.as_mut_utf16_str()
}
}