use allocator_api2::alloc::{Allocator, Global};
use crate::arena_str_macros::{impl_str_accessors, impl_str_handle_core, impl_str_read_traits};
use crate::internal::in_chunk::InSharedChunk;
use crate::internal::shared_chunk::SharedChunk;
pub struct ArcStr<A: Allocator + Clone = Global> {
data: InSharedChunk<u8, A>,
_phantom: core::marker::PhantomData<A>,
}
unsafe impl<A: Allocator + Clone + Send + Sync> Send for ArcStr<A> {}
unsafe impl<A: Allocator + Clone + Send + Sync> Sync for ArcStr<A> {}
impl_str_handle_core!(ArcStr, Shared);
impl_str_accessors!([<A: Allocator + Clone>], ArcStr<A>);
impl_str_read_traits!([<A: Allocator + Clone>], ArcStr<A>);
impl<A: Allocator + Clone> Drop for ArcStr<A> {
#[inline]
fn drop(&mut self) {
let chunk = self.data.chunk_ptr();
unsafe { SharedChunk::dec_ref(chunk) };
}
}
crate::arena_str_macros::impl_from_str_for_slice_handle!(ArcStr, Arc, u8);