use std::cell::UnsafeCell;
pub struct ParallelVec<T> {
data: UnsafeCell<Vec<T>>,
}
unsafe impl<T: Send> Send for ParallelVec<T> {}
unsafe impl<T: Send> Sync for ParallelVec<T> {}
impl<T> ParallelVec<T> {
pub fn new(vec: Vec<T>) -> Self {
Self {
data: UnsafeCell::new(vec),
}
}
pub unsafe fn write(&self, index: usize, value: T) {
unsafe {
let vec = &mut *self.data.get();
debug_assert!(index < vec.len());
*vec.get_unchecked_mut(index) = value;
}
}
pub unsafe fn get_mut_slice(&self, start: usize, len: usize) -> &mut [T] {
unsafe {
let vec = &mut *self.data.get();
debug_assert!(start + len <= vec.len());
&mut vec[start..start + len]
}
}
pub fn into_inner(self) -> Vec<T> {
self.data.into_inner()
}
}