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<'a, T> UnsafeSlice<'a, T> {
pub fn new(slice: &'a mut [T]) -> Self {
let ptr = slice as *mut [T] as *const [UnsafeCell<T>];
Self {
slice: unsafe { &*ptr },
}
}
#[inline(always)]
pub unsafe fn write(&self, i: usize, value: T) {
let ptr = unsafe { self.slice.get_unchecked(i) }.get();
*ptr = value;
}
#[allow(dead_code)]
#[inline(always)]
pub fn get(&self, i: usize) -> &T {
let ptr = unsafe { self.slice.get_unchecked(i) }.get();
unsafe { &*ptr }
}
#[allow(dead_code)]
#[inline(always)]
pub fn len(&self) -> usize {
self.slice.len()
}
}
impl<T> Index<usize> for UnsafeSlice<'_, T> {
type Output = T;
#[allow(dead_code)]
#[inline(always)]
fn index(&self, index: usize) -> &Self::Output {
let ptr = unsafe { self.slice.get_unchecked(index) }.get();
unsafe { &*ptr }
}
}