dashmap_with_out_t_map_trait/rayon/
set.rs1use crate::setref::multiple::RefMulti;
2use crate::DashSet;
3use core::hash::{BuildHasher, Hash};
4use rayon::iter::plumbing::UnindexedConsumer;
5use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator};
6use std::collections::hash_map::RandomState;
7
8impl<K, S> ParallelExtend<K> for DashSet<K, S>
9where
10 K: Send + Sync + Eq + Hash,
11 S: Send + Sync + Clone + BuildHasher,
12{
13 fn par_extend<I>(&mut self, par_iter: I)
14 where
15 I: IntoParallelIterator<Item = K>,
16 {
17 (&*self).par_extend(par_iter);
18 }
19}
20
21impl<K, S> ParallelExtend<K> for &'_ DashSet<K, S>
24where
25 K: Send + Sync + Eq + Hash,
26 S: Send + Sync + Clone + BuildHasher,
27{
28 fn par_extend<I>(&mut self, par_iter: I)
29 where
30 I: IntoParallelIterator<Item = K>,
31 {
32 let &mut set = self;
33 par_iter.into_par_iter().for_each(move |key| {
34 set.insert(key);
35 });
36 }
37}
38
39impl<K, S> FromParallelIterator<K> for DashSet<K, S>
40where
41 K: Send + Sync + Eq + Hash,
42 S: Send + Sync + Clone + Default + BuildHasher,
43{
44 fn from_par_iter<I>(par_iter: I) -> Self
45 where
46 I: IntoParallelIterator<Item = K>,
47 {
48 let set = Self::default();
49 (&set).par_extend(par_iter);
50 set
51 }
52}
53
54impl<K, S> IntoParallelIterator for DashSet<K, S>
55where
56 K: Send + Eq + Hash,
57 S: Send + Clone + BuildHasher,
58{
59 type Iter = OwningIter<K, S>;
60 type Item = K;
61
62 fn into_par_iter(self) -> Self::Iter {
63 OwningIter {
64 inner: self.inner.into_par_iter(),
65 }
66 }
67}
68
69pub struct OwningIter<K, S = RandomState> {
70 inner: super::map::OwningIter<K, (), S>,
71}
72
73impl<K, S> ParallelIterator for OwningIter<K, S>
74where
75 K: Send + Eq + Hash,
76 S: Send + Clone + BuildHasher,
77{
78 type Item = K;
79
80 fn drive_unindexed<C>(self, consumer: C) -> C::Result
81 where
82 C: UnindexedConsumer<Self::Item>,
83 {
84 self.inner.map(|(k, _)| k).drive_unindexed(consumer)
85 }
86}
87
88impl<'a, K, S> IntoParallelIterator for &'a DashSet<K, S>
90where
91 K: Send + Sync + Eq + Hash,
92 S: Send + Sync + Clone + BuildHasher,
93{
94 type Iter = Iter<'a, K, S>;
95 type Item = RefMulti<'a, K, S>;
96
97 fn into_par_iter(self) -> Self::Iter {
98 Iter {
99 inner: (&self.inner).into_par_iter(),
100 }
101 }
102}
103
104pub struct Iter<'a, K, S = RandomState> {
105 inner: super::map::Iter<'a, K, (), S>,
106}
107
108impl<'a, K, S> ParallelIterator for Iter<'a, K, S>
109where
110 K: Send + Sync + Eq + Hash,
111 S: Send + Sync + Clone + BuildHasher,
112{
113 type Item = RefMulti<'a, K, S>;
114
115 fn drive_unindexed<C>(self, consumer: C) -> C::Result
116 where
117 C: UnindexedConsumer<Self::Item>,
118 {
119 self.inner.map(RefMulti::new).drive_unindexed(consumer)
120 }
121}