use alloc::boxed::Box;
use alloc::vec::Vec;
use core::cell::UnsafeCell;
#[cfg_attr(docsrs, doc(cfg(feature = "heap-buffer")))]
pub struct HeapBuffer<T>(Box<[UnsafeCell<T>]>);
unsafe impl<T> Send for HeapBuffer<T> where T: Send {}
unsafe impl<T> Sync for HeapBuffer<T> where T: Sync {}
impl<T> HeapBuffer<T>
where
T: Default,
{
pub fn new(capacity: usize) -> Self {
let mut vec = Vec::new();
vec.resize_with(capacity, Default::default);
HeapBuffer(vec.into_boxed_slice())
}
}
impl<T> AsRef<[UnsafeCell<T>]> for HeapBuffer<T> {
fn as_ref(&self) -> &[UnsafeCell<T>] {
self.0.as_ref()
}
}
impl<T> From<Box<[T]>> for HeapBuffer<T> {
fn from(boxed_slice: Box<[T]>) -> Self {
let unsafe_cell_box: Box<[UnsafeCell<T>]> = unsafe { core::mem::transmute(boxed_slice) };
HeapBuffer(unsafe_cell_box)
}
}