Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. use rayon::prelude::*; // 1.1.0 // 0.9.0
  2.  
  3. struct MultiMutIter<'a, T, I> {
  4. last_idx: Option<usize>,
  5. idx_iter: I,
  6. slice: &'a mut [T],
  7. }
  8.  
  9. impl<'a, I, T> Iterator for MultiMutIter<'a, T, I>
  10. where
  11. I: Iterator<Item = usize>,
  12. {
  13. type Item = &'a mut T;
  14.  
  15. fn next(&mut self) -> Option<Self::Item> {
  16. let idx = self.idx_iter.next()?;
  17. let offset = if let Some(last_idx) = self.last_idx {
  18. if idx <= last_idx {
  19. panic!("indexes were not unique or not sorted");
  20. }
  21. idx - last_idx - 1
  22. } else {
  23. idx
  24. };
  25. self.last_idx = Some(idx);
  26. // Make sure new_slice's lifetime isn't limited to &self
  27. let new_slice = std::mem::replace(&mut self.slice, &mut []);
  28. let new_slice = new_slice.split_at_mut(offset).1;
  29. let (elem, new_slice) = new_slice.split_first_mut().unwrap();
  30. self.slice = new_slice;
  31. Some(elem)
  32. }
  33.  
  34. fn size_hint(&self) -> (usize, Option<usize>) {
  35. self.idx_iter.size_hint()
  36. }
  37. }
  38.  
  39. fn get_multi_mut<T, I>(slice: &mut [T], idx_iter: I) -> MultiMutIter<T, I>
  40. where
  41. I: Iterator<Item = usize>,
  42. {
  43. MultiMutIter {
  44. last_idx: None,
  45. idx_iter,
  46. slice,
  47. }
  48. }
  49.  
  50. fn main() {
  51. let mut vecs = vec![
  52. vec![1, 2, 3],
  53. vec![1, 2, 3],
  54. vec![1, 2, 3],
  55. vec![1, 2, 3],
  56. vec![1, 2, 3],
  57. vec![1, 2, 3],
  58. ];
  59. let mut indices = vec![4, 3, 1];
  60. // Ensure all indices are unique to ensure safety:
  61. indices.sort_unstable();
  62. let len = indices.len();
  63. indices.dedup();
  64. assert!(indices.len() == len);
  65. let mut_vecs: Vec<_> = get_multi_mut(&mut vecs, indices.into_iter()).collect();
  66.  
  67. mut_vecs.into_par_iter().for_each(|vec| {
  68. vec.push(4);
  69. });
  70. println!("vecs: {:?}", vecs);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement