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