use crate::fixed::{
Error as FixedVecError, FixedVec,
traits::{Storable, Word},
};
use dsi_bitstream::prelude::Endianness;
use rayon::prelude::*;
impl<T, W, E, B> FixedVec<T, W, E, B>
where
T: Storable<W> + Send + Sync,
W: Word + Sync,
E: Endianness,
B: AsRef<[W]> + Sync,
{
pub fn par_iter(&self) -> impl IndexedParallelIterator<Item = T> + '_ {
(0..self.len())
.into_par_iter()
.map(move |i| unsafe { self.get_unchecked(i) })
}
pub fn par_get_many(&self, indices: &[usize]) -> Result<Vec<T>, FixedVecError> {
if let Some(&index) = indices.iter().find(|&&idx| idx >= self.len()) {
return Err(FixedVecError::InvalidParameters(format!(
"Index {} out of bounds for vector of length {}",
index, self.len
)));
}
Ok(unsafe { self.par_get_many_unchecked(indices) })
}
pub unsafe fn par_get_many_unchecked(&self, indices: &[usize]) -> Vec<T> {
if indices.is_empty() {
return Vec::new();
}
let mut results: Vec<std::mem::MaybeUninit<T>> = Vec::with_capacity(indices.len());
results.resize_with(indices.len(), std::mem::MaybeUninit::uninit);
results
.par_iter_mut()
.zip(indices.par_iter())
.for_each(|(res_val, &index)| {
unsafe { res_val.write(self.get_unchecked(index)) };
});
unsafe { std::mem::transmute(results) }
}
}