Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use rayon::prelude::*; // 1.1.0
- fn main() {
- let mut vecs = vec![
- vec![1, 2, 3],
- vec![1, 2, 3],
- vec![1, 2, 3],
- vec![1, 2, 3],
- vec![1, 2, 3],
- vec![1, 2, 3],
- ];
- let mut indices = vec![4, 3, 1];
- // Ensure all indices are unique:
- indices.sort_unstable();
- let len = indices.len();
- indices.dedup();
- assert!(indices.len() == len);
- let mut_vecs = get_multi_mut(&mut vecs, &indices);
- // This causes an underflow on debug and a different error on release
- //let mut_vecs = get_multi_mut(&mut vecs, &[0,0,0]);
- mut_vecs.into_par_iter().for_each(|vec| {
- vec.push(4);
- });
- println!("{:?}", vecs);
- }
- fn get_multi_mut<'a, T>(mut slice: &'a mut [T], indices: &[usize]) -> Vec<&'a mut T> {
- let mut offset = 0;
- let mut result = Vec::with_capacity(indices.len());
- for &i in indices {
- let (vec, rest) = slice.split_at_mut(i - offset + 1);
- slice = rest;
- offset = i + 1;
- result.push(vec.last_mut().unwrap());
- }
- result
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement