• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::RandomState;
2 use std::collections::{hash_set, HashSet};
3 use std::fmt::{self, Debug};
4 use std::hash::{BuildHasher, Hash};
5 use std::iter::FromIterator;
6 use std::ops::{BitAnd, BitOr, BitXor, Deref, DerefMut, Sub};
7 
8 #[cfg(feature = "serde")]
9 use serde::{
10     de::{Deserialize, Deserializer},
11     ser::{Serialize, Serializer},
12 };
13 
14 /// A [`HashSet`](std::collections::HashSet) using [`RandomState`](crate::RandomState) to hash the items.
15 /// (Requires the `std` feature to be enabled.)
16 #[derive(Clone)]
17 pub struct AHashSet<T, S = crate::RandomState>(HashSet<T, S>);
18 
19 impl<T> From<HashSet<T, crate::RandomState>> for AHashSet<T> {
from(item: HashSet<T, crate::RandomState>) -> Self20     fn from(item: HashSet<T, crate::RandomState>) -> Self {
21         AHashSet(item)
22     }
23 }
24 
25 impl<T> Into<HashSet<T, crate::RandomState>> for AHashSet<T> {
into(self) -> HashSet<T, crate::RandomState>26     fn into(self) -> HashSet<T, crate::RandomState> {
27         self.0
28     }
29 }
30 
31 impl<T> AHashSet<T, RandomState> {
new() -> Self32     pub fn new() -> Self {
33         AHashSet(HashSet::with_hasher(RandomState::default()))
34     }
35 
with_capacity(capacity: usize) -> Self36     pub fn with_capacity(capacity: usize) -> Self {
37         AHashSet(HashSet::with_capacity_and_hasher(capacity, RandomState::default()))
38     }
39 }
40 
41 impl<T, S> AHashSet<T, S>
42 where
43     S: BuildHasher,
44 {
with_hasher(hash_builder: S) -> Self45     pub fn with_hasher(hash_builder: S) -> Self {
46         AHashSet(HashSet::with_hasher(hash_builder))
47     }
48 
with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self49     pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
50         AHashSet(HashSet::with_capacity_and_hasher(capacity, hash_builder))
51     }
52 }
53 
54 impl<T, S> Deref for AHashSet<T, S> {
55     type Target = HashSet<T, S>;
deref(&self) -> &Self::Target56     fn deref(&self) -> &Self::Target {
57         &self.0
58     }
59 }
60 
61 impl<T, S> DerefMut for AHashSet<T, S> {
deref_mut(&mut self) -> &mut Self::Target62     fn deref_mut(&mut self) -> &mut Self::Target {
63         &mut self.0
64     }
65 }
66 
67 impl<T, S> PartialEq for AHashSet<T, S>
68 where
69     T: Eq + Hash,
70     S: BuildHasher,
71 {
eq(&self, other: &AHashSet<T, S>) -> bool72     fn eq(&self, other: &AHashSet<T, S>) -> bool {
73         self.0.eq(&other.0)
74     }
75 }
76 
77 impl<T, S> Eq for AHashSet<T, S>
78 where
79     T: Eq + Hash,
80     S: BuildHasher,
81 {
82 }
83 
84 impl<T, S> BitOr<&AHashSet<T, S>> for &AHashSet<T, S>
85 where
86     T: Eq + Hash + Clone,
87     S: BuildHasher + Default,
88 {
89     type Output = AHashSet<T, S>;
90 
91     /// Returns the union of `self` and `rhs` as a new `AHashSet<T, S>`.
92     ///
93     /// # Examples
94     ///
95     /// ```
96     /// use ahash::AHashSet;
97     ///
98     /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect();
99     /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect();
100     ///
101     /// let set = &a | &b;
102     ///
103     /// let mut i = 0;
104     /// let expected = [1, 2, 3, 4, 5];
105     /// for x in &set {
106     ///     assert!(expected.contains(x));
107     ///     i += 1;
108     /// }
109     /// assert_eq!(i, expected.len());
110     /// ```
bitor(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S>111     fn bitor(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S> {
112         AHashSet(self.0.bitor(&rhs.0))
113     }
114 }
115 
116 impl<T, S> BitAnd<&AHashSet<T, S>> for &AHashSet<T, S>
117 where
118     T: Eq + Hash + Clone,
119     S: BuildHasher + Default,
120 {
121     type Output = AHashSet<T, S>;
122 
123     /// Returns the intersection of `self` and `rhs` as a new `AHashSet<T, S>`.
124     ///
125     /// # Examples
126     ///
127     /// ```
128     /// use ahash::AHashSet;
129     ///
130     /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect();
131     /// let b: AHashSet<_> = vec![2, 3, 4].into_iter().collect();
132     ///
133     /// let set = &a & &b;
134     ///
135     /// let mut i = 0;
136     /// let expected = [2, 3];
137     /// for x in &set {
138     ///     assert!(expected.contains(x));
139     ///     i += 1;
140     /// }
141     /// assert_eq!(i, expected.len());
142     /// ```
bitand(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S>143     fn bitand(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S> {
144         AHashSet(self.0.bitand(&rhs.0))
145     }
146 }
147 
148 impl<T, S> BitXor<&AHashSet<T, S>> for &AHashSet<T, S>
149 where
150     T: Eq + Hash + Clone,
151     S: BuildHasher + Default,
152 {
153     type Output = AHashSet<T, S>;
154 
155     /// Returns the symmetric difference of `self` and `rhs` as a new `AHashSet<T, S>`.
156     ///
157     /// # Examples
158     ///
159     /// ```
160     /// use ahash::AHashSet;
161     ///
162     /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect();
163     /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect();
164     ///
165     /// let set = &a ^ &b;
166     ///
167     /// let mut i = 0;
168     /// let expected = [1, 2, 4, 5];
169     /// for x in &set {
170     ///     assert!(expected.contains(x));
171     ///     i += 1;
172     /// }
173     /// assert_eq!(i, expected.len());
174     /// ```
bitxor(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S>175     fn bitxor(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S> {
176         AHashSet(self.0.bitxor(&rhs.0))
177     }
178 }
179 
180 impl<T, S> Sub<&AHashSet<T, S>> for &AHashSet<T, S>
181 where
182     T: Eq + Hash + Clone,
183     S: BuildHasher + Default,
184 {
185     type Output = AHashSet<T, S>;
186 
187     /// Returns the difference of `self` and `rhs` as a new `AHashSet<T, S>`.
188     ///
189     /// # Examples
190     ///
191     /// ```
192     /// use ahash::AHashSet;
193     ///
194     /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect();
195     /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect();
196     ///
197     /// let set = &a - &b;
198     ///
199     /// let mut i = 0;
200     /// let expected = [1, 2];
201     /// for x in &set {
202     ///     assert!(expected.contains(x));
203     ///     i += 1;
204     /// }
205     /// assert_eq!(i, expected.len());
206     /// ```
sub(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S>207     fn sub(self, rhs: &AHashSet<T, S>) -> AHashSet<T, S> {
208         AHashSet(self.0.sub(&rhs.0))
209     }
210 }
211 
212 impl<T, S> Debug for AHashSet<T, S>
213 where
214     T: Debug,
215     S: BuildHasher,
216 {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result217     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
218         self.0.fmt(fmt)
219     }
220 }
221 
222 impl<T, S> FromIterator<T> for AHashSet<T, S>
223 where
224     T: Eq + Hash,
225     S: BuildHasher + Default,
226 {
227     #[inline]
from_iter<I: IntoIterator<Item = T>>(iter: I) -> AHashSet<T, S>228     fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> AHashSet<T, S> {
229         AHashSet(HashSet::from_iter(iter))
230     }
231 }
232 
233 impl<'a, T, S> IntoIterator for &'a AHashSet<T, S> {
234     type Item = &'a T;
235     type IntoIter = hash_set::Iter<'a, T>;
into_iter(self) -> Self::IntoIter236     fn into_iter(self) -> Self::IntoIter {
237         (&self.0).iter()
238     }
239 }
240 
241 impl<T, S> IntoIterator for AHashSet<T, S> {
242     type Item = T;
243     type IntoIter = hash_set::IntoIter<T>;
into_iter(self) -> Self::IntoIter244     fn into_iter(self) -> Self::IntoIter {
245         self.0.into_iter()
246     }
247 }
248 
249 impl<T, S> Extend<T> for AHashSet<T, S>
250 where
251     T: Eq + Hash,
252     S: BuildHasher,
253 {
254     #[inline]
extend<I: IntoIterator<Item = T>>(&mut self, iter: I)255     fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
256         self.0.extend(iter)
257     }
258 }
259 
260 impl<'a, T, S> Extend<&'a T> for AHashSet<T, S>
261 where
262     T: 'a + Eq + Hash + Copy,
263     S: BuildHasher,
264 {
265     #[inline]
extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I)266     fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
267         self.0.extend(iter)
268     }
269 }
270 
271 impl<T> Default for AHashSet<T, RandomState> {
272     /// Creates an empty `AHashSet<T, S>` with the `Default` value for the hasher.
273     #[inline]
default() -> AHashSet<T, RandomState>274     fn default() -> AHashSet<T, RandomState> {
275         AHashSet(HashSet::default())
276     }
277 }
278 
279 #[cfg(feature = "serde")]
280 impl<T> Serialize for AHashSet<T>
281 where
282     T: Serialize + Eq + Hash,
283 {
serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>284     fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
285         self.deref().serialize(serializer)
286     }
287 }
288 
289 #[cfg(feature = "serde")]
290 impl<'de, T> Deserialize<'de> for AHashSet<T>
291 where
292     T: Deserialize<'de> + Eq + Hash,
293 {
deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>294     fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
295         let hash_set = HashSet::deserialize(deserializer);
296         hash_set.map(|hash_set| Self(hash_set))
297     }
298 }
299 
300 #[cfg(all(test, feature = "serde"))]
301 mod test {
302     use super::*;
303 
304     #[test]
test_serde()305     fn test_serde() {
306         let mut set = AHashSet::new();
307         set.insert("for".to_string());
308         set.insert("bar".to_string());
309         let serialization = serde_json::to_string(&set).unwrap();
310         let deserialization: AHashSet<String> = serde_json::from_str(&serialization).unwrap();
311         assert_eq!(deserialization, set);
312     }
313 }
314