1 //! This module contains the parallel iterator types for hash sets 2 //! (`HashSet<T>`). You will rarely need to interact with it directly 3 //! unless you have need to name one of the iterator types. 4 5 use std::collections::HashSet; 6 use std::hash::{BuildHasher, Hash}; 7 use std::marker::PhantomData; 8 9 use crate::iter::plumbing::*; 10 use crate::iter::*; 11 12 use crate::vec; 13 14 /// Parallel iterator over a hash set 15 #[derive(Debug)] // std doesn't Clone 16 pub struct IntoIter<T: Hash + Eq + Send> { 17 inner: vec::IntoIter<T>, 18 } 19 20 into_par_vec! { 21 HashSet<T, S> => IntoIter<T>, 22 impl<T: Hash + Eq + Send, S: BuildHasher> 23 } 24 25 delegate_iterator! { 26 IntoIter<T> => T, 27 impl<T: Hash + Eq + Send> 28 } 29 30 /// Parallel iterator over an immutable reference to a hash set 31 #[derive(Debug)] 32 pub struct Iter<'a, T: Hash + Eq + Sync> { 33 inner: vec::IntoIter<&'a T>, 34 } 35 36 impl<'a, T: Hash + Eq + Sync> Clone for Iter<'a, T> { clone(&self) -> Self37 fn clone(&self) -> Self { 38 Iter { 39 inner: self.inner.clone(), 40 } 41 } 42 } 43 44 into_par_vec! { 45 &'a HashSet<T, S> => Iter<'a, T>, 46 impl<'a, T: Hash + Eq + Sync, S: BuildHasher> 47 } 48 49 delegate_iterator! { 50 Iter<'a, T> => &'a T, 51 impl<'a, T: Hash + Eq + Sync + 'a> 52 } 53 54 // `HashSet` doesn't have a mutable `Iterator` 55 56 /// Draining parallel iterator that moves out of a hash set, 57 /// but keeps the total capacity. 58 #[derive(Debug)] 59 pub struct Drain<'a, T: Hash + Eq + Send> { 60 inner: vec::IntoIter<T>, 61 marker: PhantomData<&'a mut HashSet<T>>, 62 } 63 64 impl<'a, T: Hash + Eq + Send, S: BuildHasher> ParallelDrainFull for &'a mut HashSet<T, S> { 65 type Iter = Drain<'a, T>; 66 type Item = T; 67 par_drain(self) -> Self::Iter68 fn par_drain(self) -> Self::Iter { 69 let vec: Vec<_> = self.drain().collect(); 70 Drain { 71 inner: vec.into_par_iter(), 72 marker: PhantomData, 73 } 74 } 75 } 76 77 delegate_iterator! { 78 Drain<'_, T> => T, 79 impl<T: Hash + Eq + Send> 80 } 81