Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use rayon::prelude::*;
- fn par_swap_remove<T, I>(v: &mut Vec<T>, indices: I)
- where
- T: Send + Sync + std::fmt::Display,
- I: IntoParallelIterator<Item = usize>,
- I::Iter: IndexedParallelIterator,
- {
- struct SafePtr<T: ?Sized>(*mut T);
- unsafe impl<T: ?Sized> Send for SafePtr<T> {}
- unsafe impl<T: ?Sized> Sync for SafePtr<T> {}
- // Exercise for the reader to validate the incomming parallel iterator
- let len = v.len();
- let ptr = SafePtr(v.as_mut_ptr());
- let removed = indices
- .into_par_iter()
- .enumerate()
- .map(move |(i, idx)| unsafe {
- let SafePtr(ptr) = ptr;
- let hole: *mut _ = ptr.add(idx);
- let last = ptr.add(len - i - 1);
- std::ptr::swap(hole, last);
- })
- .count();
- v.truncate(len - removed);
- }
- fn main() {
- let mut v = vec![1, 2, 3, 4, 5];
- let indices: Vec<usize> = vec![0, 2, 4];
- par_swap_remove(&mut v, indices);
- println!("{:?}", v);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement