]> git.lizzy.rs Git - rust.git/blob - library/std/src/collections/hash/set.rs
Rollup merge of #97664 - estebank:suggest-bound-derive-copy, r=compiler-errors
[rust.git] / library / std / src / collections / hash / set.rs
1 #[cfg(test)]
2 mod tests;
3
4 use hashbrown::hash_set as base;
5
6 use crate::borrow::Borrow;
7 use crate::collections::TryReserveError;
8 use crate::fmt;
9 use crate::hash::{BuildHasher, Hash};
10 use crate::iter::{Chain, FusedIterator};
11 use crate::ops::{BitAnd, BitOr, BitXor, Sub};
12
13 use super::map::{map_try_reserve_error, RandomState};
14
15 // Future Optimization (FIXME!)
16 // ============================
17 //
18 // Iteration over zero sized values is a noop. There is no need
19 // for `bucket.val` in the case of HashSet. I suppose we would need HKT
20 // to get rid of it properly.
21
22 /// A [hash set] implemented as a `HashMap` where the value is `()`.
23 ///
24 /// As with the [`HashMap`] type, a `HashSet` requires that the elements
25 /// implement the [`Eq`] and [`Hash`] traits. This can frequently be achieved by
26 /// using `#[derive(PartialEq, Eq, Hash)]`. If you implement these yourself,
27 /// it is important that the following property holds:
28 ///
29 /// ```text
30 /// k1 == k2 -> hash(k1) == hash(k2)
31 /// ```
32 ///
33 /// In other words, if two keys are equal, their hashes must be equal.
34 ///
35 ///
36 /// It is a logic error for a key to be modified in such a way that the key's
37 /// hash, as determined by the [`Hash`] trait, or its equality, as determined by
38 /// the [`Eq`] trait, changes while it is in the map. This is normally only
39 /// possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
40 /// The behavior resulting from such a logic error is not specified, but will
41 /// be encapsulated to the `HashSet` that observed the logic error and not
42 /// result in undefined behavior. This could include panics, incorrect results,
43 /// aborts, memory leaks, and non-termination.
44 ///
45 /// # Examples
46 ///
47 /// ```
48 /// use std::collections::HashSet;
49 /// // Type inference lets us omit an explicit type signature (which
50 /// // would be `HashSet<String>` in this example).
51 /// let mut books = HashSet::new();
52 ///
53 /// // Add some books.
54 /// books.insert("A Dance With Dragons".to_string());
55 /// books.insert("To Kill a Mockingbird".to_string());
56 /// books.insert("The Odyssey".to_string());
57 /// books.insert("The Great Gatsby".to_string());
58 ///
59 /// // Check for a specific one.
60 /// if !books.contains("The Winds of Winter") {
61 ///     println!("We have {} books, but The Winds of Winter ain't one.",
62 ///              books.len());
63 /// }
64 ///
65 /// // Remove a book.
66 /// books.remove("The Odyssey");
67 ///
68 /// // Iterate over everything.
69 /// for book in &books {
70 ///     println!("{book}");
71 /// }
72 /// ```
73 ///
74 /// The easiest way to use `HashSet` with a custom type is to derive
75 /// [`Eq`] and [`Hash`]. We must also derive [`PartialEq`], this will in the
76 /// future be implied by [`Eq`].
77 ///
78 /// ```
79 /// use std::collections::HashSet;
80 /// #[derive(Hash, Eq, PartialEq, Debug)]
81 /// struct Viking {
82 ///     name: String,
83 ///     power: usize,
84 /// }
85 ///
86 /// let mut vikings = HashSet::new();
87 ///
88 /// vikings.insert(Viking { name: "Einar".to_string(), power: 9 });
89 /// vikings.insert(Viking { name: "Einar".to_string(), power: 9 });
90 /// vikings.insert(Viking { name: "Olaf".to_string(), power: 4 });
91 /// vikings.insert(Viking { name: "Harald".to_string(), power: 8 });
92 ///
93 /// // Use derived implementation to print the vikings.
94 /// for x in &vikings {
95 ///     println!("{x:?}");
96 /// }
97 /// ```
98 ///
99 /// A `HashSet` with a known list of items can be initialized from an array:
100 ///
101 /// ```
102 /// use std::collections::HashSet;
103 ///
104 /// let viking_names = HashSet::from(["Einar", "Olaf", "Harald"]);
105 /// ```
106 ///
107 /// [hash set]: crate::collections#use-the-set-variant-of-any-of-these-maps-when
108 /// [`HashMap`]: crate::collections::HashMap
109 /// [`RefCell`]: crate::cell::RefCell
110 /// [`Cell`]: crate::cell::Cell
111 #[cfg_attr(not(test), rustc_diagnostic_item = "HashSet")]
112 #[stable(feature = "rust1", since = "1.0.0")]
113 pub struct HashSet<T, S = RandomState> {
114     base: base::HashSet<T, S>,
115 }
116
117 impl<T> HashSet<T, RandomState> {
118     /// Creates an empty `HashSet`.
119     ///
120     /// The hash set is initially created with a capacity of 0, so it will not allocate until it
121     /// is first inserted into.
122     ///
123     /// # Examples
124     ///
125     /// ```
126     /// use std::collections::HashSet;
127     /// let set: HashSet<i32> = HashSet::new();
128     /// ```
129     #[inline]
130     #[must_use]
131     #[stable(feature = "rust1", since = "1.0.0")]
132     pub fn new() -> HashSet<T, RandomState> {
133         Default::default()
134     }
135
136     /// Creates an empty `HashSet` with the specified capacity.
137     ///
138     /// The hash set will be able to hold at least `capacity` elements without
139     /// reallocating. If `capacity` is 0, the hash set will not allocate.
140     ///
141     /// # Examples
142     ///
143     /// ```
144     /// use std::collections::HashSet;
145     /// let set: HashSet<i32> = HashSet::with_capacity(10);
146     /// assert!(set.capacity() >= 10);
147     /// ```
148     #[inline]
149     #[must_use]
150     #[stable(feature = "rust1", since = "1.0.0")]
151     pub fn with_capacity(capacity: usize) -> HashSet<T, RandomState> {
152         HashSet { base: base::HashSet::with_capacity_and_hasher(capacity, Default::default()) }
153     }
154 }
155
156 impl<T, S> HashSet<T, S> {
157     /// Returns the number of elements the set can hold without reallocating.
158     ///
159     /// # Examples
160     ///
161     /// ```
162     /// use std::collections::HashSet;
163     /// let set: HashSet<i32> = HashSet::with_capacity(100);
164     /// assert!(set.capacity() >= 100);
165     /// ```
166     #[inline]
167     #[stable(feature = "rust1", since = "1.0.0")]
168     pub fn capacity(&self) -> usize {
169         self.base.capacity()
170     }
171
172     /// An iterator visiting all elements in arbitrary order.
173     /// The iterator element type is `&'a T`.
174     ///
175     /// # Examples
176     ///
177     /// ```
178     /// use std::collections::HashSet;
179     /// let mut set = HashSet::new();
180     /// set.insert("a");
181     /// set.insert("b");
182     ///
183     /// // Will print in an arbitrary order.
184     /// for x in set.iter() {
185     ///     println!("{x}");
186     /// }
187     /// ```
188     ///
189     /// # Performance
190     ///
191     /// In the current implementation, iterating over set takes O(capacity) time
192     /// instead of O(len) because it internally visits empty buckets too.
193     #[inline]
194     #[rustc_lint_query_instability]
195     #[stable(feature = "rust1", since = "1.0.0")]
196     pub fn iter(&self) -> Iter<'_, T> {
197         Iter { base: self.base.iter() }
198     }
199
200     /// Returns the number of elements in the set.
201     ///
202     /// # Examples
203     ///
204     /// ```
205     /// use std::collections::HashSet;
206     ///
207     /// let mut v = HashSet::new();
208     /// assert_eq!(v.len(), 0);
209     /// v.insert(1);
210     /// assert_eq!(v.len(), 1);
211     /// ```
212     #[inline]
213     #[stable(feature = "rust1", since = "1.0.0")]
214     pub fn len(&self) -> usize {
215         self.base.len()
216     }
217
218     /// Returns `true` if the set contains no elements.
219     ///
220     /// # Examples
221     ///
222     /// ```
223     /// use std::collections::HashSet;
224     ///
225     /// let mut v = HashSet::new();
226     /// assert!(v.is_empty());
227     /// v.insert(1);
228     /// assert!(!v.is_empty());
229     /// ```
230     #[inline]
231     #[stable(feature = "rust1", since = "1.0.0")]
232     pub fn is_empty(&self) -> bool {
233         self.base.is_empty()
234     }
235
236     /// Clears the set, returning all elements as an iterator. Keeps the
237     /// allocated memory for reuse.
238     ///
239     /// If the returned iterator is dropped before being fully consumed, it
240     /// drops the remaining elements. The returned iterator keeps a mutable
241     /// borrow on the vector to optimize its implementation.
242     ///
243     /// # Examples
244     ///
245     /// ```
246     /// use std::collections::HashSet;
247     ///
248     /// let mut set = HashSet::from([1, 2, 3]);
249     /// assert!(!set.is_empty());
250     ///
251     /// // print 1, 2, 3 in an arbitrary order
252     /// for i in set.drain() {
253     ///     println!("{i}");
254     /// }
255     ///
256     /// assert!(set.is_empty());
257     /// ```
258     #[inline]
259     #[rustc_lint_query_instability]
260     #[stable(feature = "drain", since = "1.6.0")]
261     pub fn drain(&mut self) -> Drain<'_, T> {
262         Drain { base: self.base.drain() }
263     }
264
265     /// Creates an iterator which uses a closure to determine if a value should be removed.
266     ///
267     /// If the closure returns true, then the value is removed and yielded.
268     /// If the closure returns false, the value will remain in the list and will not be yielded
269     /// by the iterator.
270     ///
271     /// If the iterator is only partially consumed or not consumed at all, each of the remaining
272     /// values will still be subjected to the closure and removed and dropped if it returns true.
273     ///
274     /// It is unspecified how many more values will be subjected to the closure
275     /// if a panic occurs in the closure, or if a panic occurs while dropping a value, or if the
276     /// `DrainFilter` itself is leaked.
277     ///
278     /// # Examples
279     ///
280     /// Splitting a set into even and odd values, reusing the original set:
281     ///
282     /// ```
283     /// #![feature(hash_drain_filter)]
284     /// use std::collections::HashSet;
285     ///
286     /// let mut set: HashSet<i32> = (0..8).collect();
287     /// let drained: HashSet<i32> = set.drain_filter(|v| v % 2 == 0).collect();
288     ///
289     /// let mut evens = drained.into_iter().collect::<Vec<_>>();
290     /// let mut odds = set.into_iter().collect::<Vec<_>>();
291     /// evens.sort();
292     /// odds.sort();
293     ///
294     /// assert_eq!(evens, vec![0, 2, 4, 6]);
295     /// assert_eq!(odds, vec![1, 3, 5, 7]);
296     /// ```
297     #[inline]
298     #[rustc_lint_query_instability]
299     #[unstable(feature = "hash_drain_filter", issue = "59618")]
300     pub fn drain_filter<F>(&mut self, pred: F) -> DrainFilter<'_, T, F>
301     where
302         F: FnMut(&T) -> bool,
303     {
304         DrainFilter { base: self.base.drain_filter(pred) }
305     }
306
307     /// Retains only the elements specified by the predicate.
308     ///
309     /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
310     /// The elements are visited in unsorted (and unspecified) order.
311     ///
312     /// # Examples
313     ///
314     /// ```
315     /// use std::collections::HashSet;
316     ///
317     /// let mut set = HashSet::from([1, 2, 3, 4, 5, 6]);
318     /// set.retain(|&k| k % 2 == 0);
319     /// assert_eq!(set.len(), 3);
320     /// ```
321     ///
322     /// # Performance
323     ///
324     /// In the current implementation, this operation takes O(capacity) time
325     /// instead of O(len) because it internally visits empty buckets too.
326     #[rustc_lint_query_instability]
327     #[stable(feature = "retain_hash_collection", since = "1.18.0")]
328     pub fn retain<F>(&mut self, f: F)
329     where
330         F: FnMut(&T) -> bool,
331     {
332         self.base.retain(f)
333     }
334
335     /// Clears the set, removing all values.
336     ///
337     /// # Examples
338     ///
339     /// ```
340     /// use std::collections::HashSet;
341     ///
342     /// let mut v = HashSet::new();
343     /// v.insert(1);
344     /// v.clear();
345     /// assert!(v.is_empty());
346     /// ```
347     #[inline]
348     #[stable(feature = "rust1", since = "1.0.0")]
349     pub fn clear(&mut self) {
350         self.base.clear()
351     }
352
353     /// Creates a new empty hash set which will use the given hasher to hash
354     /// keys.
355     ///
356     /// The hash set is also created with the default initial capacity.
357     ///
358     /// Warning: `hasher` is normally randomly generated, and
359     /// is designed to allow `HashSet`s to be resistant to attacks that
360     /// cause many collisions and very poor performance. Setting it
361     /// manually using this function can expose a DoS attack vector.
362     ///
363     /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
364     /// the HashMap to be useful, see its documentation for details.
365     ///
366     /// # Examples
367     ///
368     /// ```
369     /// use std::collections::HashSet;
370     /// use std::collections::hash_map::RandomState;
371     ///
372     /// let s = RandomState::new();
373     /// let mut set = HashSet::with_hasher(s);
374     /// set.insert(2);
375     /// ```
376     #[inline]
377     #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
378     pub fn with_hasher(hasher: S) -> HashSet<T, S> {
379         HashSet { base: base::HashSet::with_hasher(hasher) }
380     }
381
382     /// Creates an empty `HashSet` with the specified capacity, using
383     /// `hasher` to hash the keys.
384     ///
385     /// The hash set will be able to hold at least `capacity` elements without
386     /// reallocating. If `capacity` is 0, the hash set will not allocate.
387     ///
388     /// Warning: `hasher` is normally randomly generated, and
389     /// is designed to allow `HashSet`s to be resistant to attacks that
390     /// cause many collisions and very poor performance. Setting it
391     /// manually using this function can expose a DoS attack vector.
392     ///
393     /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
394     /// the HashMap to be useful, see its documentation for details.
395     ///
396     /// # Examples
397     ///
398     /// ```
399     /// use std::collections::HashSet;
400     /// use std::collections::hash_map::RandomState;
401     ///
402     /// let s = RandomState::new();
403     /// let mut set = HashSet::with_capacity_and_hasher(10, s);
404     /// set.insert(1);
405     /// ```
406     #[inline]
407     #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
408     pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashSet<T, S> {
409         HashSet { base: base::HashSet::with_capacity_and_hasher(capacity, hasher) }
410     }
411
412     /// Returns a reference to the set's [`BuildHasher`].
413     ///
414     /// # Examples
415     ///
416     /// ```
417     /// use std::collections::HashSet;
418     /// use std::collections::hash_map::RandomState;
419     ///
420     /// let hasher = RandomState::new();
421     /// let set: HashSet<i32> = HashSet::with_hasher(hasher);
422     /// let hasher: &RandomState = set.hasher();
423     /// ```
424     #[inline]
425     #[stable(feature = "hashmap_public_hasher", since = "1.9.0")]
426     pub fn hasher(&self) -> &S {
427         self.base.hasher()
428     }
429 }
430
431 impl<T, S> HashSet<T, S>
432 where
433     T: Eq + Hash,
434     S: BuildHasher,
435 {
436     /// Reserves capacity for at least `additional` more elements to be inserted
437     /// in the `HashSet`. The collection may reserve more space to avoid
438     /// frequent reallocations.
439     ///
440     /// # Panics
441     ///
442     /// Panics if the new allocation size overflows `usize`.
443     ///
444     /// # Examples
445     ///
446     /// ```
447     /// use std::collections::HashSet;
448     /// let mut set: HashSet<i32> = HashSet::new();
449     /// set.reserve(10);
450     /// assert!(set.capacity() >= 10);
451     /// ```
452     #[inline]
453     #[stable(feature = "rust1", since = "1.0.0")]
454     pub fn reserve(&mut self, additional: usize) {
455         self.base.reserve(additional)
456     }
457
458     /// Tries to reserve capacity for at least `additional` more elements to be inserted
459     /// in the given `HashSet<K, V>`. The collection may reserve more space to avoid
460     /// frequent reallocations.
461     ///
462     /// # Errors
463     ///
464     /// If the capacity overflows, or the allocator reports a failure, then an error
465     /// is returned.
466     ///
467     /// # Examples
468     ///
469     /// ```
470     /// use std::collections::HashSet;
471     /// let mut set: HashSet<i32> = HashSet::new();
472     /// set.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?");
473     /// ```
474     #[inline]
475     #[stable(feature = "try_reserve", since = "1.57.0")]
476     pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
477         self.base.try_reserve(additional).map_err(map_try_reserve_error)
478     }
479
480     /// Shrinks the capacity of the set as much as possible. It will drop
481     /// down as much as possible while maintaining the internal rules
482     /// and possibly leaving some space in accordance with the resize policy.
483     ///
484     /// # Examples
485     ///
486     /// ```
487     /// use std::collections::HashSet;
488     ///
489     /// let mut set = HashSet::with_capacity(100);
490     /// set.insert(1);
491     /// set.insert(2);
492     /// assert!(set.capacity() >= 100);
493     /// set.shrink_to_fit();
494     /// assert!(set.capacity() >= 2);
495     /// ```
496     #[inline]
497     #[stable(feature = "rust1", since = "1.0.0")]
498     pub fn shrink_to_fit(&mut self) {
499         self.base.shrink_to_fit()
500     }
501
502     /// Shrinks the capacity of the set with a lower limit. It will drop
503     /// down no lower than the supplied limit while maintaining the internal rules
504     /// and possibly leaving some space in accordance with the resize policy.
505     ///
506     /// If the current capacity is less than the lower limit, this is a no-op.
507     /// # Examples
508     ///
509     /// ```
510     /// use std::collections::HashSet;
511     ///
512     /// let mut set = HashSet::with_capacity(100);
513     /// set.insert(1);
514     /// set.insert(2);
515     /// assert!(set.capacity() >= 100);
516     /// set.shrink_to(10);
517     /// assert!(set.capacity() >= 10);
518     /// set.shrink_to(0);
519     /// assert!(set.capacity() >= 2);
520     /// ```
521     #[inline]
522     #[stable(feature = "shrink_to", since = "1.56.0")]
523     pub fn shrink_to(&mut self, min_capacity: usize) {
524         self.base.shrink_to(min_capacity)
525     }
526
527     /// Visits the values representing the difference,
528     /// i.e., the values that are in `self` but not in `other`.
529     ///
530     /// # Examples
531     ///
532     /// ```
533     /// use std::collections::HashSet;
534     /// let a = HashSet::from([1, 2, 3]);
535     /// let b = HashSet::from([4, 2, 3, 4]);
536     ///
537     /// // Can be seen as `a - b`.
538     /// for x in a.difference(&b) {
539     ///     println!("{x}"); // Print 1
540     /// }
541     ///
542     /// let diff: HashSet<_> = a.difference(&b).collect();
543     /// assert_eq!(diff, [1].iter().collect());
544     ///
545     /// // Note that difference is not symmetric,
546     /// // and `b - a` means something else:
547     /// let diff: HashSet<_> = b.difference(&a).collect();
548     /// assert_eq!(diff, [4].iter().collect());
549     /// ```
550     #[inline]
551     #[rustc_lint_query_instability]
552     #[stable(feature = "rust1", since = "1.0.0")]
553     pub fn difference<'a>(&'a self, other: &'a HashSet<T, S>) -> Difference<'a, T, S> {
554         Difference { iter: self.iter(), other }
555     }
556
557     /// Visits the values representing the symmetric difference,
558     /// i.e., the values that are in `self` or in `other` but not in both.
559     ///
560     /// # Examples
561     ///
562     /// ```
563     /// use std::collections::HashSet;
564     /// let a = HashSet::from([1, 2, 3]);
565     /// let b = HashSet::from([4, 2, 3, 4]);
566     ///
567     /// // Print 1, 4 in arbitrary order.
568     /// for x in a.symmetric_difference(&b) {
569     ///     println!("{x}");
570     /// }
571     ///
572     /// let diff1: HashSet<_> = a.symmetric_difference(&b).collect();
573     /// let diff2: HashSet<_> = b.symmetric_difference(&a).collect();
574     ///
575     /// assert_eq!(diff1, diff2);
576     /// assert_eq!(diff1, [1, 4].iter().collect());
577     /// ```
578     #[inline]
579     #[rustc_lint_query_instability]
580     #[stable(feature = "rust1", since = "1.0.0")]
581     pub fn symmetric_difference<'a>(
582         &'a self,
583         other: &'a HashSet<T, S>,
584     ) -> SymmetricDifference<'a, T, S> {
585         SymmetricDifference { iter: self.difference(other).chain(other.difference(self)) }
586     }
587
588     /// Visits the values representing the intersection,
589     /// i.e., the values that are both in `self` and `other`.
590     ///
591     /// # Examples
592     ///
593     /// ```
594     /// use std::collections::HashSet;
595     /// let a = HashSet::from([1, 2, 3]);
596     /// let b = HashSet::from([4, 2, 3, 4]);
597     ///
598     /// // Print 2, 3 in arbitrary order.
599     /// for x in a.intersection(&b) {
600     ///     println!("{x}");
601     /// }
602     ///
603     /// let intersection: HashSet<_> = a.intersection(&b).collect();
604     /// assert_eq!(intersection, [2, 3].iter().collect());
605     /// ```
606     #[inline]
607     #[rustc_lint_query_instability]
608     #[stable(feature = "rust1", since = "1.0.0")]
609     pub fn intersection<'a>(&'a self, other: &'a HashSet<T, S>) -> Intersection<'a, T, S> {
610         if self.len() <= other.len() {
611             Intersection { iter: self.iter(), other }
612         } else {
613             Intersection { iter: other.iter(), other: self }
614         }
615     }
616
617     /// Visits the values representing the union,
618     /// i.e., all the values in `self` or `other`, without duplicates.
619     ///
620     /// # Examples
621     ///
622     /// ```
623     /// use std::collections::HashSet;
624     /// let a = HashSet::from([1, 2, 3]);
625     /// let b = HashSet::from([4, 2, 3, 4]);
626     ///
627     /// // Print 1, 2, 3, 4 in arbitrary order.
628     /// for x in a.union(&b) {
629     ///     println!("{x}");
630     /// }
631     ///
632     /// let union: HashSet<_> = a.union(&b).collect();
633     /// assert_eq!(union, [1, 2, 3, 4].iter().collect());
634     /// ```
635     #[inline]
636     #[rustc_lint_query_instability]
637     #[stable(feature = "rust1", since = "1.0.0")]
638     pub fn union<'a>(&'a self, other: &'a HashSet<T, S>) -> Union<'a, T, S> {
639         if self.len() >= other.len() {
640             Union { iter: self.iter().chain(other.difference(self)) }
641         } else {
642             Union { iter: other.iter().chain(self.difference(other)) }
643         }
644     }
645
646     /// Returns `true` if the set contains a value.
647     ///
648     /// The value may be any borrowed form of the set's value type, but
649     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
650     /// the value type.
651     ///
652     /// # Examples
653     ///
654     /// ```
655     /// use std::collections::HashSet;
656     ///
657     /// let set = HashSet::from([1, 2, 3]);
658     /// assert_eq!(set.contains(&1), true);
659     /// assert_eq!(set.contains(&4), false);
660     /// ```
661     #[inline]
662     #[stable(feature = "rust1", since = "1.0.0")]
663     pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
664     where
665         T: Borrow<Q>,
666         Q: Hash + Eq,
667     {
668         self.base.contains(value)
669     }
670
671     /// Returns a reference to the value in the set, if any, that is equal to the given value.
672     ///
673     /// The value may be any borrowed form of the set's value type, but
674     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
675     /// the value type.
676     ///
677     /// # Examples
678     ///
679     /// ```
680     /// use std::collections::HashSet;
681     ///
682     /// let set = HashSet::from([1, 2, 3]);
683     /// assert_eq!(set.get(&2), Some(&2));
684     /// assert_eq!(set.get(&4), None);
685     /// ```
686     #[inline]
687     #[stable(feature = "set_recovery", since = "1.9.0")]
688     pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
689     where
690         T: Borrow<Q>,
691         Q: Hash + Eq,
692     {
693         self.base.get(value)
694     }
695
696     /// Inserts the given `value` into the set if it is not present, then
697     /// returns a reference to the value in the set.
698     ///
699     /// # Examples
700     ///
701     /// ```
702     /// #![feature(hash_set_entry)]
703     ///
704     /// use std::collections::HashSet;
705     ///
706     /// let mut set = HashSet::from([1, 2, 3]);
707     /// assert_eq!(set.len(), 3);
708     /// assert_eq!(set.get_or_insert(2), &2);
709     /// assert_eq!(set.get_or_insert(100), &100);
710     /// assert_eq!(set.len(), 4); // 100 was inserted
711     /// ```
712     #[inline]
713     #[unstable(feature = "hash_set_entry", issue = "60896")]
714     pub fn get_or_insert(&mut self, value: T) -> &T {
715         // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with
716         // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`.
717         self.base.get_or_insert(value)
718     }
719
720     /// Inserts an owned copy of the given `value` into the set if it is not
721     /// present, then returns a reference to the value in the set.
722     ///
723     /// # Examples
724     ///
725     /// ```
726     /// #![feature(hash_set_entry)]
727     ///
728     /// use std::collections::HashSet;
729     ///
730     /// let mut set: HashSet<String> = ["cat", "dog", "horse"]
731     ///     .iter().map(|&pet| pet.to_owned()).collect();
732     ///
733     /// assert_eq!(set.len(), 3);
734     /// for &pet in &["cat", "dog", "fish"] {
735     ///     let value = set.get_or_insert_owned(pet);
736     ///     assert_eq!(value, pet);
737     /// }
738     /// assert_eq!(set.len(), 4); // a new "fish" was inserted
739     /// ```
740     #[inline]
741     #[unstable(feature = "hash_set_entry", issue = "60896")]
742     pub fn get_or_insert_owned<Q: ?Sized>(&mut self, value: &Q) -> &T
743     where
744         T: Borrow<Q>,
745         Q: Hash + Eq + ToOwned<Owned = T>,
746     {
747         // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with
748         // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`.
749         self.base.get_or_insert_owned(value)
750     }
751
752     /// Inserts a value computed from `f` into the set if the given `value` is
753     /// not present, then returns a reference to the value in the set.
754     ///
755     /// # Examples
756     ///
757     /// ```
758     /// #![feature(hash_set_entry)]
759     ///
760     /// use std::collections::HashSet;
761     ///
762     /// let mut set: HashSet<String> = ["cat", "dog", "horse"]
763     ///     .iter().map(|&pet| pet.to_owned()).collect();
764     ///
765     /// assert_eq!(set.len(), 3);
766     /// for &pet in &["cat", "dog", "fish"] {
767     ///     let value = set.get_or_insert_with(pet, str::to_owned);
768     ///     assert_eq!(value, pet);
769     /// }
770     /// assert_eq!(set.len(), 4); // a new "fish" was inserted
771     /// ```
772     #[inline]
773     #[unstable(feature = "hash_set_entry", issue = "60896")]
774     pub fn get_or_insert_with<Q: ?Sized, F>(&mut self, value: &Q, f: F) -> &T
775     where
776         T: Borrow<Q>,
777         Q: Hash + Eq,
778         F: FnOnce(&Q) -> T,
779     {
780         // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with
781         // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`.
782         self.base.get_or_insert_with(value, f)
783     }
784
785     /// Returns `true` if `self` has no elements in common with `other`.
786     /// This is equivalent to checking for an empty intersection.
787     ///
788     /// # Examples
789     ///
790     /// ```
791     /// use std::collections::HashSet;
792     ///
793     /// let a = HashSet::from([1, 2, 3]);
794     /// let mut b = HashSet::new();
795     ///
796     /// assert_eq!(a.is_disjoint(&b), true);
797     /// b.insert(4);
798     /// assert_eq!(a.is_disjoint(&b), true);
799     /// b.insert(1);
800     /// assert_eq!(a.is_disjoint(&b), false);
801     /// ```
802     #[stable(feature = "rust1", since = "1.0.0")]
803     pub fn is_disjoint(&self, other: &HashSet<T, S>) -> bool {
804         if self.len() <= other.len() {
805             self.iter().all(|v| !other.contains(v))
806         } else {
807             other.iter().all(|v| !self.contains(v))
808         }
809     }
810
811     /// Returns `true` if the set is a subset of another,
812     /// i.e., `other` contains at least all the values in `self`.
813     ///
814     /// # Examples
815     ///
816     /// ```
817     /// use std::collections::HashSet;
818     ///
819     /// let sup = HashSet::from([1, 2, 3]);
820     /// let mut set = HashSet::new();
821     ///
822     /// assert_eq!(set.is_subset(&sup), true);
823     /// set.insert(2);
824     /// assert_eq!(set.is_subset(&sup), true);
825     /// set.insert(4);
826     /// assert_eq!(set.is_subset(&sup), false);
827     /// ```
828     #[stable(feature = "rust1", since = "1.0.0")]
829     pub fn is_subset(&self, other: &HashSet<T, S>) -> bool {
830         if self.len() <= other.len() { self.iter().all(|v| other.contains(v)) } else { false }
831     }
832
833     /// Returns `true` if the set is a superset of another,
834     /// i.e., `self` contains at least all the values in `other`.
835     ///
836     /// # Examples
837     ///
838     /// ```
839     /// use std::collections::HashSet;
840     ///
841     /// let sub = HashSet::from([1, 2]);
842     /// let mut set = HashSet::new();
843     ///
844     /// assert_eq!(set.is_superset(&sub), false);
845     ///
846     /// set.insert(0);
847     /// set.insert(1);
848     /// assert_eq!(set.is_superset(&sub), false);
849     ///
850     /// set.insert(2);
851     /// assert_eq!(set.is_superset(&sub), true);
852     /// ```
853     #[inline]
854     #[stable(feature = "rust1", since = "1.0.0")]
855     pub fn is_superset(&self, other: &HashSet<T, S>) -> bool {
856         other.is_subset(self)
857     }
858
859     /// Adds a value to the set.
860     ///
861     /// Returns whether the value was newly inserted. That is:
862     ///
863     /// - If the set did not previously contain this value, `true` is returned.
864     /// - If the set already contained this value, `false` is returned.
865     ///
866     /// # Examples
867     ///
868     /// ```
869     /// use std::collections::HashSet;
870     ///
871     /// let mut set = HashSet::new();
872     ///
873     /// assert_eq!(set.insert(2), true);
874     /// assert_eq!(set.insert(2), false);
875     /// assert_eq!(set.len(), 1);
876     /// ```
877     #[inline]
878     #[stable(feature = "rust1", since = "1.0.0")]
879     pub fn insert(&mut self, value: T) -> bool {
880         self.base.insert(value)
881     }
882
883     /// Adds a value to the set, replacing the existing value, if any, that is equal to the given
884     /// one. Returns the replaced value.
885     ///
886     /// # Examples
887     ///
888     /// ```
889     /// use std::collections::HashSet;
890     ///
891     /// let mut set = HashSet::new();
892     /// set.insert(Vec::<i32>::new());
893     ///
894     /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0);
895     /// set.replace(Vec::with_capacity(10));
896     /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10);
897     /// ```
898     #[inline]
899     #[stable(feature = "set_recovery", since = "1.9.0")]
900     pub fn replace(&mut self, value: T) -> Option<T> {
901         self.base.replace(value)
902     }
903
904     /// Removes a value from the set. Returns whether the value was
905     /// present in the set.
906     ///
907     /// The value may be any borrowed form of the set's value type, but
908     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
909     /// the value type.
910     ///
911     /// # Examples
912     ///
913     /// ```
914     /// use std::collections::HashSet;
915     ///
916     /// let mut set = HashSet::new();
917     ///
918     /// set.insert(2);
919     /// assert_eq!(set.remove(&2), true);
920     /// assert_eq!(set.remove(&2), false);
921     /// ```
922     #[inline]
923     #[stable(feature = "rust1", since = "1.0.0")]
924     pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
925     where
926         T: Borrow<Q>,
927         Q: Hash + Eq,
928     {
929         self.base.remove(value)
930     }
931
932     /// Removes and returns the value in the set, if any, that is equal to the given one.
933     ///
934     /// The value may be any borrowed form of the set's value type, but
935     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
936     /// the value type.
937     ///
938     /// # Examples
939     ///
940     /// ```
941     /// use std::collections::HashSet;
942     ///
943     /// let mut set = HashSet::from([1, 2, 3]);
944     /// assert_eq!(set.take(&2), Some(2));
945     /// assert_eq!(set.take(&2), None);
946     /// ```
947     #[inline]
948     #[stable(feature = "set_recovery", since = "1.9.0")]
949     pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
950     where
951         T: Borrow<Q>,
952         Q: Hash + Eq,
953     {
954         self.base.take(value)
955     }
956 }
957
958 #[stable(feature = "rust1", since = "1.0.0")]
959 impl<T, S> Clone for HashSet<T, S>
960 where
961     T: Clone,
962     S: Clone,
963 {
964     #[inline]
965     fn clone(&self) -> Self {
966         Self { base: self.base.clone() }
967     }
968
969     #[inline]
970     fn clone_from(&mut self, other: &Self) {
971         self.base.clone_from(&other.base);
972     }
973 }
974
975 #[stable(feature = "rust1", since = "1.0.0")]
976 impl<T, S> PartialEq for HashSet<T, S>
977 where
978     T: Eq + Hash,
979     S: BuildHasher,
980 {
981     fn eq(&self, other: &HashSet<T, S>) -> bool {
982         if self.len() != other.len() {
983             return false;
984         }
985
986         self.iter().all(|key| other.contains(key))
987     }
988 }
989
990 #[stable(feature = "rust1", since = "1.0.0")]
991 impl<T, S> Eq for HashSet<T, S>
992 where
993     T: Eq + Hash,
994     S: BuildHasher,
995 {
996 }
997
998 #[stable(feature = "rust1", since = "1.0.0")]
999 impl<T, S> fmt::Debug for HashSet<T, S>
1000 where
1001     T: fmt::Debug,
1002 {
1003     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1004         f.debug_set().entries(self.iter()).finish()
1005     }
1006 }
1007
1008 #[stable(feature = "rust1", since = "1.0.0")]
1009 impl<T, S> FromIterator<T> for HashSet<T, S>
1010 where
1011     T: Eq + Hash,
1012     S: BuildHasher + Default,
1013 {
1014     #[inline]
1015     fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> HashSet<T, S> {
1016         let mut set = HashSet::with_hasher(Default::default());
1017         set.extend(iter);
1018         set
1019     }
1020 }
1021
1022 #[stable(feature = "std_collections_from_array", since = "1.56.0")]
1023 // Note: as what is currently the most convenient built-in way to construct
1024 // a HashSet, a simple usage of this function must not *require* the user
1025 // to provide a type annotation in order to infer the third type parameter
1026 // (the hasher parameter, conventionally "S").
1027 // To that end, this impl is defined using RandomState as the concrete
1028 // type of S, rather than being generic over `S: BuildHasher + Default`.
1029 // It is expected that users who want to specify a hasher will manually use
1030 // `with_capacity_and_hasher`.
1031 // If type parameter defaults worked on impls, and if type parameter
1032 // defaults could be mixed with const generics, then perhaps
1033 // this could be generalized.
1034 // See also the equivalent impl on HashMap.
1035 impl<T, const N: usize> From<[T; N]> for HashSet<T, RandomState>
1036 where
1037     T: Eq + Hash,
1038 {
1039     /// # Examples
1040     ///
1041     /// ```
1042     /// use std::collections::HashSet;
1043     ///
1044     /// let set1 = HashSet::from([1, 2, 3, 4]);
1045     /// let set2: HashSet<_> = [1, 2, 3, 4].into();
1046     /// assert_eq!(set1, set2);
1047     /// ```
1048     fn from(arr: [T; N]) -> Self {
1049         Self::from_iter(arr)
1050     }
1051 }
1052
1053 #[stable(feature = "rust1", since = "1.0.0")]
1054 impl<T, S> Extend<T> for HashSet<T, S>
1055 where
1056     T: Eq + Hash,
1057     S: BuildHasher,
1058 {
1059     #[inline]
1060     fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1061         self.base.extend(iter);
1062     }
1063
1064     #[inline]
1065     fn extend_one(&mut self, item: T) {
1066         self.base.insert(item);
1067     }
1068
1069     #[inline]
1070     fn extend_reserve(&mut self, additional: usize) {
1071         self.base.extend_reserve(additional);
1072     }
1073 }
1074
1075 #[stable(feature = "hash_extend_copy", since = "1.4.0")]
1076 impl<'a, T, S> Extend<&'a T> for HashSet<T, S>
1077 where
1078     T: 'a + Eq + Hash + Copy,
1079     S: BuildHasher,
1080 {
1081     #[inline]
1082     fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1083         self.extend(iter.into_iter().cloned());
1084     }
1085
1086     #[inline]
1087     fn extend_one(&mut self, &item: &'a T) {
1088         self.base.insert(item);
1089     }
1090
1091     #[inline]
1092     fn extend_reserve(&mut self, additional: usize) {
1093         Extend::<T>::extend_reserve(self, additional)
1094     }
1095 }
1096
1097 #[stable(feature = "rust1", since = "1.0.0")]
1098 impl<T, S> Default for HashSet<T, S>
1099 where
1100     S: Default,
1101 {
1102     /// Creates an empty `HashSet<T, S>` with the `Default` value for the hasher.
1103     #[inline]
1104     fn default() -> HashSet<T, S> {
1105         HashSet { base: Default::default() }
1106     }
1107 }
1108
1109 #[stable(feature = "rust1", since = "1.0.0")]
1110 impl<T, S> BitOr<&HashSet<T, S>> for &HashSet<T, S>
1111 where
1112     T: Eq + Hash + Clone,
1113     S: BuildHasher + Default,
1114 {
1115     type Output = HashSet<T, S>;
1116
1117     /// Returns the union of `self` and `rhs` as a new `HashSet<T, S>`.
1118     ///
1119     /// # Examples
1120     ///
1121     /// ```
1122     /// use std::collections::HashSet;
1123     ///
1124     /// let a = HashSet::from([1, 2, 3]);
1125     /// let b = HashSet::from([3, 4, 5]);
1126     ///
1127     /// let set = &a | &b;
1128     ///
1129     /// let mut i = 0;
1130     /// let expected = [1, 2, 3, 4, 5];
1131     /// for x in &set {
1132     ///     assert!(expected.contains(x));
1133     ///     i += 1;
1134     /// }
1135     /// assert_eq!(i, expected.len());
1136     /// ```
1137     fn bitor(self, rhs: &HashSet<T, S>) -> HashSet<T, S> {
1138         self.union(rhs).cloned().collect()
1139     }
1140 }
1141
1142 #[stable(feature = "rust1", since = "1.0.0")]
1143 impl<T, S> BitAnd<&HashSet<T, S>> for &HashSet<T, S>
1144 where
1145     T: Eq + Hash + Clone,
1146     S: BuildHasher + Default,
1147 {
1148     type Output = HashSet<T, S>;
1149
1150     /// Returns the intersection of `self` and `rhs` as a new `HashSet<T, S>`.
1151     ///
1152     /// # Examples
1153     ///
1154     /// ```
1155     /// use std::collections::HashSet;
1156     ///
1157     /// let a = HashSet::from([1, 2, 3]);
1158     /// let b = HashSet::from([2, 3, 4]);
1159     ///
1160     /// let set = &a & &b;
1161     ///
1162     /// let mut i = 0;
1163     /// let expected = [2, 3];
1164     /// for x in &set {
1165     ///     assert!(expected.contains(x));
1166     ///     i += 1;
1167     /// }
1168     /// assert_eq!(i, expected.len());
1169     /// ```
1170     fn bitand(self, rhs: &HashSet<T, S>) -> HashSet<T, S> {
1171         self.intersection(rhs).cloned().collect()
1172     }
1173 }
1174
1175 #[stable(feature = "rust1", since = "1.0.0")]
1176 impl<T, S> BitXor<&HashSet<T, S>> for &HashSet<T, S>
1177 where
1178     T: Eq + Hash + Clone,
1179     S: BuildHasher + Default,
1180 {
1181     type Output = HashSet<T, S>;
1182
1183     /// Returns the symmetric difference of `self` and `rhs` as a new `HashSet<T, S>`.
1184     ///
1185     /// # Examples
1186     ///
1187     /// ```
1188     /// use std::collections::HashSet;
1189     ///
1190     /// let a = HashSet::from([1, 2, 3]);
1191     /// let b = HashSet::from([3, 4, 5]);
1192     ///
1193     /// let set = &a ^ &b;
1194     ///
1195     /// let mut i = 0;
1196     /// let expected = [1, 2, 4, 5];
1197     /// for x in &set {
1198     ///     assert!(expected.contains(x));
1199     ///     i += 1;
1200     /// }
1201     /// assert_eq!(i, expected.len());
1202     /// ```
1203     fn bitxor(self, rhs: &HashSet<T, S>) -> HashSet<T, S> {
1204         self.symmetric_difference(rhs).cloned().collect()
1205     }
1206 }
1207
1208 #[stable(feature = "rust1", since = "1.0.0")]
1209 impl<T, S> Sub<&HashSet<T, S>> for &HashSet<T, S>
1210 where
1211     T: Eq + Hash + Clone,
1212     S: BuildHasher + Default,
1213 {
1214     type Output = HashSet<T, S>;
1215
1216     /// Returns the difference of `self` and `rhs` as a new `HashSet<T, S>`.
1217     ///
1218     /// # Examples
1219     ///
1220     /// ```
1221     /// use std::collections::HashSet;
1222     ///
1223     /// let a = HashSet::from([1, 2, 3]);
1224     /// let b = HashSet::from([3, 4, 5]);
1225     ///
1226     /// let set = &a - &b;
1227     ///
1228     /// let mut i = 0;
1229     /// let expected = [1, 2];
1230     /// for x in &set {
1231     ///     assert!(expected.contains(x));
1232     ///     i += 1;
1233     /// }
1234     /// assert_eq!(i, expected.len());
1235     /// ```
1236     fn sub(self, rhs: &HashSet<T, S>) -> HashSet<T, S> {
1237         self.difference(rhs).cloned().collect()
1238     }
1239 }
1240
1241 /// An iterator over the items of a `HashSet`.
1242 ///
1243 /// This `struct` is created by the [`iter`] method on [`HashSet`].
1244 /// See its documentation for more.
1245 ///
1246 /// [`iter`]: HashSet::iter
1247 ///
1248 /// # Examples
1249 ///
1250 /// ```
1251 /// use std::collections::HashSet;
1252 ///
1253 /// let a = HashSet::from([1, 2, 3]);
1254 ///
1255 /// let mut iter = a.iter();
1256 /// ```
1257 #[stable(feature = "rust1", since = "1.0.0")]
1258 pub struct Iter<'a, K: 'a> {
1259     base: base::Iter<'a, K>,
1260 }
1261
1262 /// An owning iterator over the items of a `HashSet`.
1263 ///
1264 /// This `struct` is created by the [`into_iter`] method on [`HashSet`]
1265 /// (provided by the [`IntoIterator`] trait). See its documentation for more.
1266 ///
1267 /// [`into_iter`]: IntoIterator::into_iter
1268 /// [`IntoIterator`]: crate::iter::IntoIterator
1269 ///
1270 /// # Examples
1271 ///
1272 /// ```
1273 /// use std::collections::HashSet;
1274 ///
1275 /// let a = HashSet::from([1, 2, 3]);
1276 ///
1277 /// let mut iter = a.into_iter();
1278 /// ```
1279 #[stable(feature = "rust1", since = "1.0.0")]
1280 pub struct IntoIter<K> {
1281     base: base::IntoIter<K>,
1282 }
1283
1284 /// A draining iterator over the items of a `HashSet`.
1285 ///
1286 /// This `struct` is created by the [`drain`] method on [`HashSet`].
1287 /// See its documentation for more.
1288 ///
1289 /// [`drain`]: HashSet::drain
1290 ///
1291 /// # Examples
1292 ///
1293 /// ```
1294 /// use std::collections::HashSet;
1295 ///
1296 /// let mut a = HashSet::from([1, 2, 3]);
1297 ///
1298 /// let mut drain = a.drain();
1299 /// ```
1300 #[stable(feature = "rust1", since = "1.0.0")]
1301 pub struct Drain<'a, K: 'a> {
1302     base: base::Drain<'a, K>,
1303 }
1304
1305 /// A draining, filtering iterator over the items of a `HashSet`.
1306 ///
1307 /// This `struct` is created by the [`drain_filter`] method on [`HashSet`].
1308 ///
1309 /// [`drain_filter`]: HashSet::drain_filter
1310 ///
1311 /// # Examples
1312 ///
1313 /// ```
1314 /// #![feature(hash_drain_filter)]
1315 ///
1316 /// use std::collections::HashSet;
1317 ///
1318 /// let mut a = HashSet::from([1, 2, 3]);
1319 ///
1320 /// let mut drain_filtered = a.drain_filter(|v| v % 2 == 0);
1321 /// ```
1322 #[unstable(feature = "hash_drain_filter", issue = "59618")]
1323 pub struct DrainFilter<'a, K, F>
1324 where
1325     F: FnMut(&K) -> bool,
1326 {
1327     base: base::DrainFilter<'a, K, F>,
1328 }
1329
1330 /// A lazy iterator producing elements in the intersection of `HashSet`s.
1331 ///
1332 /// This `struct` is created by the [`intersection`] method on [`HashSet`].
1333 /// See its documentation for more.
1334 ///
1335 /// [`intersection`]: HashSet::intersection
1336 ///
1337 /// # Examples
1338 ///
1339 /// ```
1340 /// use std::collections::HashSet;
1341 ///
1342 /// let a = HashSet::from([1, 2, 3]);
1343 /// let b = HashSet::from([4, 2, 3, 4]);
1344 ///
1345 /// let mut intersection = a.intersection(&b);
1346 /// ```
1347 #[must_use = "this returns the intersection as an iterator, \
1348               without modifying either input set"]
1349 #[stable(feature = "rust1", since = "1.0.0")]
1350 pub struct Intersection<'a, T: 'a, S: 'a> {
1351     // iterator of the first set
1352     iter: Iter<'a, T>,
1353     // the second set
1354     other: &'a HashSet<T, S>,
1355 }
1356
1357 /// A lazy iterator producing elements in the difference of `HashSet`s.
1358 ///
1359 /// This `struct` is created by the [`difference`] method on [`HashSet`].
1360 /// See its documentation for more.
1361 ///
1362 /// [`difference`]: HashSet::difference
1363 ///
1364 /// # Examples
1365 ///
1366 /// ```
1367 /// use std::collections::HashSet;
1368 ///
1369 /// let a = HashSet::from([1, 2, 3]);
1370 /// let b = HashSet::from([4, 2, 3, 4]);
1371 ///
1372 /// let mut difference = a.difference(&b);
1373 /// ```
1374 #[must_use = "this returns the difference as an iterator, \
1375               without modifying either input set"]
1376 #[stable(feature = "rust1", since = "1.0.0")]
1377 pub struct Difference<'a, T: 'a, S: 'a> {
1378     // iterator of the first set
1379     iter: Iter<'a, T>,
1380     // the second set
1381     other: &'a HashSet<T, S>,
1382 }
1383
1384 /// A lazy iterator producing elements in the symmetric difference of `HashSet`s.
1385 ///
1386 /// This `struct` is created by the [`symmetric_difference`] method on
1387 /// [`HashSet`]. See its documentation for more.
1388 ///
1389 /// [`symmetric_difference`]: HashSet::symmetric_difference
1390 ///
1391 /// # Examples
1392 ///
1393 /// ```
1394 /// use std::collections::HashSet;
1395 ///
1396 /// let a = HashSet::from([1, 2, 3]);
1397 /// let b = HashSet::from([4, 2, 3, 4]);
1398 ///
1399 /// let mut intersection = a.symmetric_difference(&b);
1400 /// ```
1401 #[must_use = "this returns the difference as an iterator, \
1402               without modifying either input set"]
1403 #[stable(feature = "rust1", since = "1.0.0")]
1404 pub struct SymmetricDifference<'a, T: 'a, S: 'a> {
1405     iter: Chain<Difference<'a, T, S>, Difference<'a, T, S>>,
1406 }
1407
1408 /// A lazy iterator producing elements in the union of `HashSet`s.
1409 ///
1410 /// This `struct` is created by the [`union`] method on [`HashSet`].
1411 /// See its documentation for more.
1412 ///
1413 /// [`union`]: HashSet::union
1414 ///
1415 /// # Examples
1416 ///
1417 /// ```
1418 /// use std::collections::HashSet;
1419 ///
1420 /// let a = HashSet::from([1, 2, 3]);
1421 /// let b = HashSet::from([4, 2, 3, 4]);
1422 ///
1423 /// let mut union_iter = a.union(&b);
1424 /// ```
1425 #[must_use = "this returns the union as an iterator, \
1426               without modifying either input set"]
1427 #[stable(feature = "rust1", since = "1.0.0")]
1428 pub struct Union<'a, T: 'a, S: 'a> {
1429     iter: Chain<Iter<'a, T>, Difference<'a, T, S>>,
1430 }
1431
1432 #[stable(feature = "rust1", since = "1.0.0")]
1433 impl<'a, T, S> IntoIterator for &'a HashSet<T, S> {
1434     type Item = &'a T;
1435     type IntoIter = Iter<'a, T>;
1436
1437     #[inline]
1438     #[rustc_lint_query_instability]
1439     fn into_iter(self) -> Iter<'a, T> {
1440         self.iter()
1441     }
1442 }
1443
1444 #[stable(feature = "rust1", since = "1.0.0")]
1445 impl<T, S> IntoIterator for HashSet<T, S> {
1446     type Item = T;
1447     type IntoIter = IntoIter<T>;
1448
1449     /// Creates a consuming iterator, that is, one that moves each value out
1450     /// of the set in arbitrary order. The set cannot be used after calling
1451     /// this.
1452     ///
1453     /// # Examples
1454     ///
1455     /// ```
1456     /// use std::collections::HashSet;
1457     /// let mut set = HashSet::new();
1458     /// set.insert("a".to_string());
1459     /// set.insert("b".to_string());
1460     ///
1461     /// // Not possible to collect to a Vec<String> with a regular `.iter()`.
1462     /// let v: Vec<String> = set.into_iter().collect();
1463     ///
1464     /// // Will print in an arbitrary order.
1465     /// for x in &v {
1466     ///     println!("{x}");
1467     /// }
1468     /// ```
1469     #[inline]
1470     #[rustc_lint_query_instability]
1471     fn into_iter(self) -> IntoIter<T> {
1472         IntoIter { base: self.base.into_iter() }
1473     }
1474 }
1475
1476 #[stable(feature = "rust1", since = "1.0.0")]
1477 impl<K> Clone for Iter<'_, K> {
1478     #[inline]
1479     fn clone(&self) -> Self {
1480         Iter { base: self.base.clone() }
1481     }
1482 }
1483 #[stable(feature = "rust1", since = "1.0.0")]
1484 impl<'a, K> Iterator for Iter<'a, K> {
1485     type Item = &'a K;
1486
1487     #[inline]
1488     fn next(&mut self) -> Option<&'a K> {
1489         self.base.next()
1490     }
1491     #[inline]
1492     fn size_hint(&self) -> (usize, Option<usize>) {
1493         self.base.size_hint()
1494     }
1495 }
1496 #[stable(feature = "rust1", since = "1.0.0")]
1497 impl<K> ExactSizeIterator for Iter<'_, K> {
1498     #[inline]
1499     fn len(&self) -> usize {
1500         self.base.len()
1501     }
1502 }
1503 #[stable(feature = "fused", since = "1.26.0")]
1504 impl<K> FusedIterator for Iter<'_, K> {}
1505
1506 #[stable(feature = "std_debug", since = "1.16.0")]
1507 impl<K: fmt::Debug> fmt::Debug for Iter<'_, K> {
1508     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1509         f.debug_list().entries(self.clone()).finish()
1510     }
1511 }
1512
1513 #[stable(feature = "rust1", since = "1.0.0")]
1514 impl<K> Iterator for IntoIter<K> {
1515     type Item = K;
1516
1517     #[inline]
1518     fn next(&mut self) -> Option<K> {
1519         self.base.next()
1520     }
1521     #[inline]
1522     fn size_hint(&self) -> (usize, Option<usize>) {
1523         self.base.size_hint()
1524     }
1525 }
1526 #[stable(feature = "rust1", since = "1.0.0")]
1527 impl<K> ExactSizeIterator for IntoIter<K> {
1528     #[inline]
1529     fn len(&self) -> usize {
1530         self.base.len()
1531     }
1532 }
1533 #[stable(feature = "fused", since = "1.26.0")]
1534 impl<K> FusedIterator for IntoIter<K> {}
1535
1536 #[stable(feature = "std_debug", since = "1.16.0")]
1537 impl<K: fmt::Debug> fmt::Debug for IntoIter<K> {
1538     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1539         fmt::Debug::fmt(&self.base, f)
1540     }
1541 }
1542
1543 #[stable(feature = "rust1", since = "1.0.0")]
1544 impl<'a, K> Iterator for Drain<'a, K> {
1545     type Item = K;
1546
1547     #[inline]
1548     fn next(&mut self) -> Option<K> {
1549         self.base.next()
1550     }
1551     #[inline]
1552     fn size_hint(&self) -> (usize, Option<usize>) {
1553         self.base.size_hint()
1554     }
1555 }
1556 #[stable(feature = "rust1", since = "1.0.0")]
1557 impl<K> ExactSizeIterator for Drain<'_, K> {
1558     #[inline]
1559     fn len(&self) -> usize {
1560         self.base.len()
1561     }
1562 }
1563 #[stable(feature = "fused", since = "1.26.0")]
1564 impl<K> FusedIterator for Drain<'_, K> {}
1565
1566 #[stable(feature = "std_debug", since = "1.16.0")]
1567 impl<K: fmt::Debug> fmt::Debug for Drain<'_, K> {
1568     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1569         fmt::Debug::fmt(&self.base, f)
1570     }
1571 }
1572
1573 #[unstable(feature = "hash_drain_filter", issue = "59618")]
1574 impl<K, F> Iterator for DrainFilter<'_, K, F>
1575 where
1576     F: FnMut(&K) -> bool,
1577 {
1578     type Item = K;
1579
1580     #[inline]
1581     fn next(&mut self) -> Option<K> {
1582         self.base.next()
1583     }
1584     #[inline]
1585     fn size_hint(&self) -> (usize, Option<usize>) {
1586         self.base.size_hint()
1587     }
1588 }
1589
1590 #[unstable(feature = "hash_drain_filter", issue = "59618")]
1591 impl<K, F> FusedIterator for DrainFilter<'_, K, F> where F: FnMut(&K) -> bool {}
1592
1593 #[unstable(feature = "hash_drain_filter", issue = "59618")]
1594 impl<'a, K, F> fmt::Debug for DrainFilter<'a, K, F>
1595 where
1596     F: FnMut(&K) -> bool,
1597 {
1598     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1599         f.debug_struct("DrainFilter").finish_non_exhaustive()
1600     }
1601 }
1602
1603 #[stable(feature = "rust1", since = "1.0.0")]
1604 impl<T, S> Clone for Intersection<'_, T, S> {
1605     #[inline]
1606     fn clone(&self) -> Self {
1607         Intersection { iter: self.iter.clone(), ..*self }
1608     }
1609 }
1610
1611 #[stable(feature = "rust1", since = "1.0.0")]
1612 impl<'a, T, S> Iterator for Intersection<'a, T, S>
1613 where
1614     T: Eq + Hash,
1615     S: BuildHasher,
1616 {
1617     type Item = &'a T;
1618
1619     #[inline]
1620     fn next(&mut self) -> Option<&'a T> {
1621         loop {
1622             let elt = self.iter.next()?;
1623             if self.other.contains(elt) {
1624                 return Some(elt);
1625             }
1626         }
1627     }
1628
1629     #[inline]
1630     fn size_hint(&self) -> (usize, Option<usize>) {
1631         let (_, upper) = self.iter.size_hint();
1632         (0, upper)
1633     }
1634 }
1635
1636 #[stable(feature = "std_debug", since = "1.16.0")]
1637 impl<T, S> fmt::Debug for Intersection<'_, T, S>
1638 where
1639     T: fmt::Debug + Eq + Hash,
1640     S: BuildHasher,
1641 {
1642     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1643         f.debug_list().entries(self.clone()).finish()
1644     }
1645 }
1646
1647 #[stable(feature = "fused", since = "1.26.0")]
1648 impl<T, S> FusedIterator for Intersection<'_, T, S>
1649 where
1650     T: Eq + Hash,
1651     S: BuildHasher,
1652 {
1653 }
1654
1655 #[stable(feature = "rust1", since = "1.0.0")]
1656 impl<T, S> Clone for Difference<'_, T, S> {
1657     #[inline]
1658     fn clone(&self) -> Self {
1659         Difference { iter: self.iter.clone(), ..*self }
1660     }
1661 }
1662
1663 #[stable(feature = "rust1", since = "1.0.0")]
1664 impl<'a, T, S> Iterator for Difference<'a, T, S>
1665 where
1666     T: Eq + Hash,
1667     S: BuildHasher,
1668 {
1669     type Item = &'a T;
1670
1671     #[inline]
1672     fn next(&mut self) -> Option<&'a T> {
1673         loop {
1674             let elt = self.iter.next()?;
1675             if !self.other.contains(elt) {
1676                 return Some(elt);
1677             }
1678         }
1679     }
1680
1681     #[inline]
1682     fn size_hint(&self) -> (usize, Option<usize>) {
1683         let (_, upper) = self.iter.size_hint();
1684         (0, upper)
1685     }
1686 }
1687
1688 #[stable(feature = "fused", since = "1.26.0")]
1689 impl<T, S> FusedIterator for Difference<'_, T, S>
1690 where
1691     T: Eq + Hash,
1692     S: BuildHasher,
1693 {
1694 }
1695
1696 #[stable(feature = "std_debug", since = "1.16.0")]
1697 impl<T, S> fmt::Debug for Difference<'_, T, S>
1698 where
1699     T: fmt::Debug + Eq + Hash,
1700     S: BuildHasher,
1701 {
1702     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1703         f.debug_list().entries(self.clone()).finish()
1704     }
1705 }
1706
1707 #[stable(feature = "rust1", since = "1.0.0")]
1708 impl<T, S> Clone for SymmetricDifference<'_, T, S> {
1709     #[inline]
1710     fn clone(&self) -> Self {
1711         SymmetricDifference { iter: self.iter.clone() }
1712     }
1713 }
1714
1715 #[stable(feature = "rust1", since = "1.0.0")]
1716 impl<'a, T, S> Iterator for SymmetricDifference<'a, T, S>
1717 where
1718     T: Eq + Hash,
1719     S: BuildHasher,
1720 {
1721     type Item = &'a T;
1722
1723     #[inline]
1724     fn next(&mut self) -> Option<&'a T> {
1725         self.iter.next()
1726     }
1727     #[inline]
1728     fn size_hint(&self) -> (usize, Option<usize>) {
1729         self.iter.size_hint()
1730     }
1731 }
1732
1733 #[stable(feature = "fused", since = "1.26.0")]
1734 impl<T, S> FusedIterator for SymmetricDifference<'_, T, S>
1735 where
1736     T: Eq + Hash,
1737     S: BuildHasher,
1738 {
1739 }
1740
1741 #[stable(feature = "std_debug", since = "1.16.0")]
1742 impl<T, S> fmt::Debug for SymmetricDifference<'_, T, S>
1743 where
1744     T: fmt::Debug + Eq + Hash,
1745     S: BuildHasher,
1746 {
1747     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1748         f.debug_list().entries(self.clone()).finish()
1749     }
1750 }
1751
1752 #[stable(feature = "rust1", since = "1.0.0")]
1753 impl<T, S> Clone for Union<'_, T, S> {
1754     #[inline]
1755     fn clone(&self) -> Self {
1756         Union { iter: self.iter.clone() }
1757     }
1758 }
1759
1760 #[stable(feature = "fused", since = "1.26.0")]
1761 impl<T, S> FusedIterator for Union<'_, T, S>
1762 where
1763     T: Eq + Hash,
1764     S: BuildHasher,
1765 {
1766 }
1767
1768 #[stable(feature = "std_debug", since = "1.16.0")]
1769 impl<T, S> fmt::Debug for Union<'_, T, S>
1770 where
1771     T: fmt::Debug + Eq + Hash,
1772     S: BuildHasher,
1773 {
1774     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1775         f.debug_list().entries(self.clone()).finish()
1776     }
1777 }
1778
1779 #[stable(feature = "rust1", since = "1.0.0")]
1780 impl<'a, T, S> Iterator for Union<'a, T, S>
1781 where
1782     T: Eq + Hash,
1783     S: BuildHasher,
1784 {
1785     type Item = &'a T;
1786
1787     #[inline]
1788     fn next(&mut self) -> Option<&'a T> {
1789         self.iter.next()
1790     }
1791     #[inline]
1792     fn size_hint(&self) -> (usize, Option<usize>) {
1793         self.iter.size_hint()
1794     }
1795 }
1796
1797 #[allow(dead_code)]
1798 fn assert_covariance() {
1799     fn set<'new>(v: HashSet<&'static str>) -> HashSet<&'new str> {
1800         v
1801     }
1802     fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> {
1803         v
1804     }
1805     fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> {
1806         v
1807     }
1808     fn difference<'a, 'new>(
1809         v: Difference<'a, &'static str, RandomState>,
1810     ) -> Difference<'a, &'new str, RandomState> {
1811         v
1812     }
1813     fn symmetric_difference<'a, 'new>(
1814         v: SymmetricDifference<'a, &'static str, RandomState>,
1815     ) -> SymmetricDifference<'a, &'new str, RandomState> {
1816         v
1817     }
1818     fn intersection<'a, 'new>(
1819         v: Intersection<'a, &'static str, RandomState>,
1820     ) -> Intersection<'a, &'new str, RandomState> {
1821         v
1822     }
1823     fn union<'a, 'new>(
1824         v: Union<'a, &'static str, RandomState>,
1825     ) -> Union<'a, &'new str, RandomState> {
1826         v
1827     }
1828     fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1829         d
1830     }
1831 }