use std::cell::UnsafeCell;
use std::ops::Index;
#[derive(Copy, Clone)]
pub struct UnsafeSlice<'a, T> {
pub slice: &'a [UnsafeCell<T>],
}
unsafe impl<T: Send + Sync> Send for UnsafeSlice<'_, T> {}
unsafe impl<T: Send + Sync> Sync for UnsafeSlice<'_, T> {}
impl<T> UnsafeSlice<'_, T> {
pub fn new(slice: &'_ mut [T]) -> Self {
let ptr = slice as *mut [T] as *const [UnsafeCell<T>];
Self {
slice: unsafe { &*ptr },
}
}
#[allow(dead_code)]
pub fn mut_ptr(&self) -> *mut T {
self.slice.as_ptr() as *const T as *mut T
}
#[allow(dead_code)]
pub unsafe fn write(&self, i: usize, value: T) {
let ptr = self.slice[i].get();
*ptr = value;
}
#[allow(dead_code)]
pub fn get(&self, i: usize) -> &T {
let ptr = self.slice[i].get();
unsafe { &*ptr }
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.slice.len()
}
}
impl<T> Index<usize> for UnsafeSlice<'_, T> {
type Output = T;
#[allow(dead_code)]
fn index(&self, index: usize) -> &Self::Output {
let ptr = self.slice[index].get();
unsafe { &*ptr }
}
}