vector_map/
set.rs

1use crate::{Keys, VecMap};
2use std::{
3    fmt,
4    iter::{Chain, FromIterator},
5    ops::{BitAnd, BitOr, BitXor, Sub},
6};
7
8#[derive(Clone)]
9pub struct VecSet<T> {
10    map: VecMap<T, ()>,
11}
12
13impl<T: PartialEq> VecSet<T> {
14    /// Creates an empty VecSet.
15    ///
16    /// # Examples
17    ///
18    /// ```
19    /// use vector_map::set::VecSet;;
20    /// let mut set: VecSet<i32> = VecSet::new();
21    /// ```
22    #[inline]
23    pub fn new() -> VecSet<T> {
24        VecSet { map: VecMap::new() }
25    }
26
27    /// Creates an empty VecSet with space for at least `n` elements in
28    /// the map.
29    ///
30    /// # Examples
31    ///
32    /// ```
33    /// use vector_map::set::VecSet;;
34    /// let mut set: VecSet<i32> = VecSet::with_capacity(10);
35    /// ```
36    #[inline]
37    pub fn with_capacity(capacity: usize) -> VecSet<T> {
38        VecSet {
39            map: VecMap::with_capacity(capacity),
40        }
41    }
42}
43
44impl<T> VecSet<T> {
45    /// Returns the number of elements the set can hold without reallocating.
46    ///
47    /// # Examples
48    ///
49    /// ```
50    /// use vector_map::set::VecSet;;
51    /// let set: VecSet<i32> = VecSet::with_capacity(100);
52    /// assert!(set.capacity() >= 100);
53    /// ```
54    #[inline]
55    pub fn capacity(&self) -> usize {
56        self.map.capacity()
57    }
58
59    /// Reserves capacity for at least `additional` more elements to be inserted
60    /// in the `VecSet`. The collection may reserve more space to avoid
61    /// frequent reallocations.
62    ///
63    /// # Panics
64    ///
65    /// Panics if the new allocation size overflows `usize`.
66    ///
67    /// # Examples
68    ///
69    /// ```
70    /// use vector_map::set::VecSet;;
71    /// let mut set: VecSet<i32> = VecSet::new();
72    /// set.reserve(10);
73    /// ```
74    pub fn reserve(&mut self, additional: usize) {
75        self.map.reserve(additional)
76    }
77
78    /// Shrinks the capacity of the set as much as possible. It will drop
79    /// down as much as possible while maintaining the internal rules
80    /// and possibly leaving some space in accordance with the resize policy.
81    ///
82    /// # Examples
83    ///
84    /// ```
85    /// use vector_map::set::VecSet;;
86    ///
87    /// let mut set = VecSet::with_capacity(100);
88    /// set.insert(1);
89    /// set.insert(2);
90    /// assert!(set.capacity() >= 100);
91    /// set.shrink_to_fit();
92    /// assert!(set.capacity() >= 2);
93    /// ```
94    pub fn shrink_to_fit(&mut self) {
95        self.map.shrink_to_fit()
96    }
97
98    /// An iterator visiting all elements in arbitrary order.
99    /// Iterator element type is &'a T.
100    ///
101    /// # Examples
102    ///
103    /// ```
104    /// use vector_map::set::VecSet;;
105    /// let mut set = VecSet::new();
106    /// set.insert("a");
107    /// set.insert("b");
108    ///
109    /// // Will print in an arbitrary order.
110    /// for x in set.iter() {
111    ///     println!("{}", x);
112    /// }
113    /// ```
114    pub fn iter(&self) -> Iter<T> {
115        Iter {
116            iter: self.map.keys(),
117        }
118    }
119
120    /// Visit the values representing the difference.
121    ///
122    /// # Examples
123    ///
124    /// ```
125    /// use vector_map::set::VecSet;;
126    /// let a: VecSet<_> = [1, 2, 3].iter().cloned().collect();
127    /// let b: VecSet<_> = [4, 2, 3, 4].iter().cloned().collect();
128    ///
129    /// // Can be seen as `a - b`.
130    /// for x in a.difference(&b) {
131    ///     println!("{}", x); // Print 1
132    /// }
133    ///
134    /// let diff: VecSet<_> = a.difference(&b).cloned().collect();
135    /// assert_eq!(diff, [1].iter().cloned().collect());
136    ///
137    /// // Note that difference is not symmetric,
138    /// // and `b - a` means something else:
139    /// let diff: VecSet<_> = b.difference(&a).cloned().collect();
140    /// assert_eq!(diff, [4].iter().cloned().collect());
141    /// ```
142    pub fn difference<'a>(&'a self, other: &'a VecSet<T>) -> Difference<'a, T>
143    where
144        T: PartialEq,
145    {
146        Difference {
147            iter: self.iter(),
148            other,
149        }
150    }
151
152    /// Visit the values representing the symmetric difference.
153    ///
154    /// # Examples
155    ///
156    /// ```
157    /// use vector_map::set::VecSet;;
158    /// let a: VecSet<_> = [1, 2, 3].iter().cloned().collect();
159    /// let b: VecSet<_> = [4, 2, 3, 4].iter().cloned().collect();
160    ///
161    /// // Print 1, 4 in arbitrary order.
162    /// for x in a.symmetric_difference(&b) {
163    ///     println!("{}", x);
164    /// }
165    ///
166    /// let diff1: VecSet<_> = a.symmetric_difference(&b).cloned().collect();
167    /// let diff2: VecSet<_> = b.symmetric_difference(&a).cloned().collect();
168    ///
169    /// assert_eq!(diff1, diff2);
170    /// assert_eq!(diff1, [1, 4].iter().cloned().collect());
171    /// ```
172    pub fn symmetric_difference<'a>(&'a self, other: &'a VecSet<T>) -> SymmetricDifference<'a, T>
173    where
174        T: PartialEq,
175    {
176        SymmetricDifference {
177            iter: self.difference(other).chain(other.difference(self)),
178        }
179    }
180
181    /// Visit the values representing the intersection.
182    ///
183    /// # Examples
184    ///
185    /// ```
186    /// use vector_map::set::VecSet;;
187    /// let a: VecSet<_> = [1, 2, 3].iter().cloned().collect();
188    /// let b: VecSet<_> = [4, 2, 3, 4].iter().cloned().collect();
189    ///
190    /// // Print 2, 3 in arbitrary order.
191    /// for x in a.intersection(&b) {
192    ///     println!("{}", x);
193    /// }
194    ///
195    /// let intersection: VecSet<_> = a.intersection(&b).cloned().collect();
196    /// assert_eq!(intersection, [2, 3].iter().cloned().collect());
197    /// ```
198    pub fn intersection<'a>(&'a self, other: &'a VecSet<T>) -> Intersection<'a, T> {
199        Intersection {
200            iter: self.iter(),
201            other,
202        }
203    }
204
205    /// Visit the values representing the union.
206    ///
207    /// # Examples
208    ///
209    /// ```
210    /// use vector_map::set::VecSet;;
211    /// let a: VecSet<_> = [1, 2, 3].iter().cloned().collect();
212    /// let b: VecSet<_> = [4, 2, 3, 4].iter().cloned().collect();
213    ///
214    /// // Print 1, 2, 3, 4 in arbitrary order.
215    /// for x in a.union(&b) {
216    ///     println!("{}", x);
217    /// }
218    ///
219    /// let union: VecSet<_> = a.union(&b).cloned().collect();
220    /// assert_eq!(union, [1, 2, 3, 4].iter().cloned().collect());
221    /// ```
222    pub fn union<'a>(&'a self, other: &'a VecSet<T>) -> Union<'a, T>
223    where
224        T: PartialEq,
225    {
226        Union {
227            iter: self.iter().chain(other.difference(self)),
228        }
229    }
230
231    /// Returns the number of elements in the set.
232    ///
233    /// # Examples
234    ///
235    /// ```
236    /// use vector_map::set::VecSet;;
237    ///
238    /// let mut v = VecSet::new();
239    /// assert_eq!(v.len(), 0);
240    /// v.insert(1);
241    /// assert_eq!(v.len(), 1);
242    /// ```
243    pub fn len(&self) -> usize {
244        self.map.len()
245    }
246
247    /// Returns true if the set contains no elements.
248    ///
249    /// # Examples
250    ///
251    /// ```
252    /// use vector_map::set::VecSet;;
253    ///
254    /// let mut v = VecSet::new();
255    /// assert!(v.is_empty());
256    /// v.insert(1);
257    /// assert!(!v.is_empty());
258    /// ```
259    pub fn is_empty(&self) -> bool {
260        self.map.is_empty()
261    }
262
263    /// Clears the set, returning all elements in an iterator.
264    #[inline]
265    pub fn drain(&mut self) -> Drain<T> {
266        Drain {
267            iter: self.map.drain(),
268        }
269    }
270
271    /// Clears the set, removing all values.
272    ///
273    /// # Examples
274    ///
275    /// ```
276    /// use vector_map::set::VecSet;;
277    ///
278    /// let mut v = VecSet::new();
279    /// v.insert(1);
280    /// v.clear();
281    /// assert!(v.is_empty());
282    /// ```
283    pub fn clear(&mut self) {
284        self.map.clear()
285    }
286
287    /// Retains only the elements specified by the predicate.
288    ///
289    /// In other words, remove all elements `e` such that `f(&e)` returns `false`.
290    ///
291    pub fn retain<F>(&mut self, mut f: F)
292    where
293        F: FnMut(&T) -> bool,
294    {
295        self.map.retain(|k, _| f(k));
296    }
297
298    /// Returns `true` if the set contains a value.
299    ///
300    /// The value may be any borrowed form of the set's value type, but
301    /// `Eq` on the borrowed form *must* match those for
302    /// the value type.
303    ///
304    /// # Examples
305    ///
306    /// ```
307    /// use vector_map::set::VecSet;;
308    ///
309    /// let set: VecSet<_> = [1, 2, 3].iter().cloned().collect();
310    /// assert_eq!(set.contains(&1), true);
311    /// assert_eq!(set.contains(&4), false);
312    /// ```
313    pub fn contains<Q: PartialEq<T> + ?Sized>(&self, value: &Q) -> bool {
314        self.map.contains_key(value)
315    }
316
317    /// Returns `true` if the set has no elements in common with `other`.
318    /// This is equivalent to checking for an empty intersection.
319    ///
320    /// # Examples
321    ///
322    /// ```
323    /// use vector_map::set::VecSet;;
324    ///
325    /// let a: VecSet<_> = [1, 2, 3].iter().cloned().collect();
326    /// let mut b = VecSet::new();
327    ///
328    /// assert_eq!(a.is_disjoint(&b), true);
329    /// b.insert(4);
330    /// assert_eq!(a.is_disjoint(&b), true);
331    /// b.insert(1);
332    /// assert_eq!(a.is_disjoint(&b), false);
333    /// ```
334    pub fn is_disjoint(&self, other: &VecSet<T>) -> bool
335    where
336        T: PartialEq,
337    {
338        self.iter().all(|v| !other.contains(v))
339    }
340
341    /// Returns `true` if the set is a subset of another.
342    ///
343    /// # Examples
344    ///
345    /// ```
346    /// use vector_map::set::VecSet;;
347    ///
348    /// let sup: VecSet<_> = [1, 2, 3].iter().cloned().collect();
349    /// let mut set = VecSet::new();
350    ///
351    /// assert_eq!(set.is_subset(&sup), true);
352    /// set.insert(2);
353    /// assert_eq!(set.is_subset(&sup), true);
354    /// set.insert(4);
355    /// assert_eq!(set.is_subset(&sup), false);
356    /// ```
357    pub fn is_subset(&self, other: &VecSet<T>) -> bool
358    where
359        T: PartialEq,
360    {
361        self.iter().all(|v| other.contains(v))
362    }
363
364    /// Returns `true` if the set is a superset of another.
365    ///
366    /// # Examples
367    ///
368    /// ```
369    /// use vector_map::set::VecSet;;
370    ///
371    /// let sub: VecSet<_> = [1, 2].iter().cloned().collect();
372    /// let mut set = VecSet::new();
373    ///
374    /// assert_eq!(set.is_superset(&sub), false);
375    ///
376    /// set.insert(0);
377    /// set.insert(1);
378    /// assert_eq!(set.is_superset(&sub), false);
379    ///
380    /// set.insert(2);
381    /// assert_eq!(set.is_superset(&sub), true);
382    /// ```
383    #[inline]
384    pub fn is_superset(&self, other: &VecSet<T>) -> bool
385    where
386        T: PartialEq,
387    {
388        other.is_subset(self)
389    }
390
391    /// Adds a value to the set.
392    ///
393    /// If the set did not have a value present, `true` is returned.
394    ///
395    /// If the set did have this key present, `false` is returned.
396    ///
397    /// # Examples
398    ///
399    /// ```
400    /// use vector_map::set::VecSet;;
401    ///
402    /// let mut set = VecSet::new();
403    ///
404    /// assert_eq!(set.insert(2), true);
405    /// assert_eq!(set.insert(2), false);
406    /// assert_eq!(set.len(), 1);
407    /// ```
408    pub fn insert(&mut self, value: T) -> bool
409    where
410        T: PartialEq,
411    {
412        self.map.insert(value, ()).is_none()
413    }
414
415    /// Removes a value from the set. Returns `true` if the value was
416    /// present in the set.
417    ///
418    /// The value may be any borrowed form of the set's value type, but
419    /// `Eq` on the borrowed form *must* match those for
420    /// the value type.
421    ///
422    /// # Examples
423    ///
424    /// ```
425    /// use vector_map::set::VecSet;;
426    ///
427    /// let mut set = VecSet::new();
428    ///
429    /// set.insert(2);
430    /// assert_eq!(set.remove(&2), true);
431    /// assert_eq!(set.remove(&2), false);
432    /// ```
433    pub fn remove<Q: PartialEq<T> + ?Sized>(&mut self, value: &Q) -> bool {
434        self.map.remove(value).is_some()
435    }
436}
437
438impl<T> PartialEq for VecSet<T>
439where
440    T: PartialEq,
441{
442    fn eq(&self, other: &VecSet<T>) -> bool {
443        if self.len() != other.len() {
444            return false;
445        }
446
447        self.iter().all(|key| other.contains(key))
448    }
449}
450
451impl<T> Eq for VecSet<T> where T: Eq {}
452
453impl<T> fmt::Debug for VecSet<T>
454where
455    T: fmt::Debug,
456{
457    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
458        f.debug_set().entries(self.iter()).finish()
459    }
460}
461
462impl<T> FromIterator<T> for VecSet<T>
463where
464    T: PartialEq,
465{
466    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> VecSet<T> {
467        let iterator = iter.into_iter();
468        let lower = iterator.size_hint().0;
469        let mut set = VecSet::with_capacity(lower);
470        set.extend(iterator);
471        set
472    }
473}
474
475impl<T> Extend<T> for VecSet<T>
476where
477    T: PartialEq,
478{
479    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
480        for k in iter {
481            self.insert(k);
482        }
483    }
484}
485
486impl<'a, T> Extend<&'a T> for VecSet<T>
487where
488    T: 'a + PartialEq + Copy,
489{
490    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
491        self.extend(iter.into_iter().cloned());
492    }
493}
494
495impl<T> Default for VecSet<T>
496where
497    T: PartialEq,
498{
499    fn default() -> VecSet<T> {
500        VecSet::new()
501    }
502}
503
504impl<K: PartialEq> From<VecSet<K>> for Vec<K> {
505    fn from(val: VecSet<K>) -> Self {
506        val.map.keys
507    }
508}
509
510impl<'a, 'b, T> BitOr<&'b VecSet<T>> for &'a VecSet<T>
511where
512    T: PartialEq + Clone,
513{
514    type Output = VecSet<T>;
515
516    /// Returns the union of `self` and `rhs` as a new `VecSet<T>`.
517    ///
518    /// # Examples
519    ///
520    /// ```
521    /// use vector_map::set::VecSet;;
522    ///
523    /// let a: VecSet<_> = vec![1, 2, 3].into_iter().collect();
524    /// let b: VecSet<_> = vec![3, 4, 5].into_iter().collect();
525    ///
526    /// let set = &a | &b;
527    ///
528    /// let mut i = 0;
529    /// let expected = [1, 2, 3, 4, 5];
530    /// for x in &set {
531    ///     assert!(expected.contains(x));
532    ///     i += 1;
533    /// }
534    /// assert_eq!(i, expected.len());
535    /// ```
536    fn bitor(self, rhs: &VecSet<T>) -> VecSet<T> {
537        self.union(rhs).cloned().collect()
538    }
539}
540
541impl<'a, 'b, T> BitAnd<&'b VecSet<T>> for &'a VecSet<T>
542where
543    T: PartialEq + Clone,
544{
545    type Output = VecSet<T>;
546
547    /// Returns the intersection of `self` and `rhs` as a new `VecSet<T>`.
548    ///
549    /// # Examples
550    ///
551    /// ```
552    /// use vector_map::set::VecSet;;
553    ///
554    /// let a: VecSet<_> = vec![1, 2, 3].into_iter().collect();
555    /// let b: VecSet<_> = vec![2, 3, 4].into_iter().collect();
556    ///
557    /// let set = &a & &b;
558    ///
559    /// let mut i = 0;
560    /// let expected = [2, 3];
561    /// for x in &set {
562    ///     assert!(expected.contains(x));
563    ///     i += 1;
564    /// }
565    /// assert_eq!(i, expected.len());
566    /// ```
567    fn bitand(self, rhs: &VecSet<T>) -> VecSet<T> {
568        self.intersection(rhs).cloned().collect()
569    }
570}
571
572impl<'a, 'b, T> BitXor<&'b VecSet<T>> for &'a VecSet<T>
573where
574    T: PartialEq + Clone,
575{
576    type Output = VecSet<T>;
577
578    /// Returns the symmetric difference of `self` and `rhs` as a new `VecSet<T>`.
579    ///
580    /// # Examples
581    ///
582    /// ```
583    /// use vector_map::set::VecSet;;
584    ///
585    /// let a: VecSet<_> = vec![1, 2, 3].into_iter().collect();
586    /// let b: VecSet<_> = vec![3, 4, 5].into_iter().collect();
587    ///
588    /// let set = &a ^ &b;
589    ///
590    /// let mut i = 0;
591    /// let expected = [1, 2, 4, 5];
592    /// for x in &set {
593    ///     assert!(expected.contains(x));
594    ///     i += 1;
595    /// }
596    /// assert_eq!(i, expected.len());
597    /// ```
598    fn bitxor(self, rhs: &VecSet<T>) -> VecSet<T> {
599        self.symmetric_difference(rhs).cloned().collect()
600    }
601}
602
603impl<'a, 'b, T> Sub<&'b VecSet<T>> for &'a VecSet<T>
604where
605    T: PartialEq + Clone,
606{
607    type Output = VecSet<T>;
608
609    /// Returns the difference of `self` and `rhs` as a new `VecSet<T>`.
610    ///
611    /// # Examples
612    ///
613    /// ```
614    /// use vector_map::set::VecSet;;
615    ///
616    /// let a: VecSet<_> = vec![1, 2, 3].into_iter().collect();
617    /// let b: VecSet<_> = vec![3, 4, 5].into_iter().collect();
618    ///
619    /// let set = &a - &b;
620    ///
621    /// let mut i = 0;
622    /// let expected = [1, 2];
623    /// for x in &set {
624    ///     assert!(expected.contains(x));
625    ///     i += 1;
626    /// }
627    /// assert_eq!(i, expected.len());
628    /// ```
629    fn sub(self, rhs: &VecSet<T>) -> VecSet<T> {
630        self.difference(rhs).cloned().collect()
631    }
632}
633
634/// VecSet iterator
635pub struct Iter<'a, K: 'a> {
636    iter: Keys<'a, K, ()>,
637}
638
639/// VecSet move iterator
640pub struct IntoIter<K> {
641    iter: super::IntoIter<K, ()>,
642}
643
644/// VecSet drain iterator
645pub struct Drain<'a, K: 'a> {
646    iter: super::Drain<'a, K, ()>,
647}
648
649/// Intersection iterator
650pub struct Intersection<'a, T: 'a> {
651    // iterator of the first set
652    iter: Iter<'a, T>,
653    // the second set
654    other: &'a VecSet<T>,
655}
656
657/// Difference iterator
658pub struct Difference<'a, T: 'a>
659where
660    T: PartialEq,
661{
662    // iterator of the first set
663    iter: Iter<'a, T>,
664    // the second set
665    other: &'a VecSet<T>,
666}
667
668/// Symmetric difference iterator.
669pub struct SymmetricDifference<'a, T: 'a>
670where
671    T: PartialEq,
672{
673    iter: Chain<Difference<'a, T>, Difference<'a, T>>,
674}
675
676/// Set union iterator.
677pub struct Union<'a, T: 'a>
678where
679    T: PartialEq,
680{
681    iter: Chain<Iter<'a, T>, Difference<'a, T>>,
682}
683
684impl<'a, T> IntoIterator for &'a VecSet<T>
685where
686    T: PartialEq,
687{
688    type Item = &'a T;
689    type IntoIter = Iter<'a, T>;
690
691    fn into_iter(self) -> Iter<'a, T> {
692        self.iter()
693    }
694}
695
696impl<T> IntoIterator for VecSet<T>
697where
698    T: PartialEq,
699{
700    type Item = T;
701    type IntoIter = IntoIter<T>;
702
703    /// Creates a consuming iterator, that is, one that moves each value out
704    /// of the set in arbitrary order. The set cannot be used after calling
705    /// this.
706    ///
707    /// # Examples
708    ///
709    /// ```
710    /// use vector_map::set::VecSet;;
711    /// let mut set = VecSet::new();
712    /// set.insert("a".to_string());
713    /// set.insert("b".to_string());
714    ///
715    /// // Not possible to collect to a Vec<String> with a regular `.iter()`.
716    /// let v: Vec<String> = set.into_iter().collect();
717    ///
718    /// // Will print in an arbitrary order.
719    /// for x in &v {
720    ///     println!("{}", x);
721    /// }
722    /// ```
723    fn into_iter(self) -> IntoIter<T> {
724        IntoIter {
725            iter: self.map.into_iter(),
726        }
727    }
728}
729
730impl<'a, K> Clone for Iter<'a, K> {
731    fn clone(&self) -> Iter<'a, K> {
732        Iter {
733            iter: self.iter.clone(),
734        }
735    }
736}
737impl<'a, K> Iterator for Iter<'a, K> {
738    type Item = &'a K;
739
740    fn next(&mut self) -> Option<&'a K> {
741        self.iter.next()
742    }
743    fn size_hint(&self) -> (usize, Option<usize>) {
744        self.iter.size_hint()
745    }
746}
747impl<'a, K> ExactSizeIterator for Iter<'a, K> {
748    fn len(&self) -> usize {
749        self.iter.len()
750    }
751}
752
753impl<K> Iterator for IntoIter<K> {
754    type Item = K;
755
756    fn next(&mut self) -> Option<K> {
757        self.iter.next().map(|(k, _)| k)
758    }
759    fn size_hint(&self) -> (usize, Option<usize>) {
760        self.iter.size_hint()
761    }
762}
763impl<K> ExactSizeIterator for IntoIter<K> {
764    fn len(&self) -> usize {
765        self.iter.len()
766    }
767}
768
769impl<'a, K> Iterator for Drain<'a, K> {
770    type Item = K;
771
772    fn next(&mut self) -> Option<K> {
773        self.iter.next().map(|(k, _)| k)
774    }
775    fn size_hint(&self) -> (usize, Option<usize>) {
776        self.iter.size_hint()
777    }
778}
779impl<'a, K> ExactSizeIterator for Drain<'a, K> {
780    fn len(&self) -> usize {
781        self.iter.len()
782    }
783}
784
785impl<'a, T> Clone for Intersection<'a, T> {
786    fn clone(&self) -> Intersection<'a, T> {
787        Intersection {
788            iter: self.iter.clone(),
789            ..*self
790        }
791    }
792}
793
794impl<'a, T> Iterator for Intersection<'a, T>
795where
796    T: PartialEq,
797{
798    type Item = &'a T;
799
800    fn next(&mut self) -> Option<&'a T> {
801        loop {
802            match self.iter.next() {
803                None => return None,
804                Some(elt) => {
805                    if self.other.contains(elt) {
806                        return Some(elt);
807                    }
808                }
809            }
810        }
811    }
812
813    fn size_hint(&self) -> (usize, Option<usize>) {
814        let (_, upper) = self.iter.size_hint();
815        (0, upper)
816    }
817}
818
819impl<'a, T> Clone for Difference<'a, T>
820where
821    T: PartialEq,
822{
823    fn clone(&self) -> Difference<'a, T> {
824        Difference {
825            iter: self.iter.clone(),
826            ..*self
827        }
828    }
829}
830
831impl<'a, T> Iterator for Difference<'a, T>
832where
833    T: PartialEq,
834{
835    type Item = &'a T;
836
837    fn next(&mut self) -> Option<&'a T> {
838        loop {
839            match self.iter.next() {
840                None => return None,
841                Some(elt) => {
842                    if !self.other.contains(elt) {
843                        return Some(elt);
844                    }
845                }
846            }
847        }
848    }
849
850    fn size_hint(&self) -> (usize, Option<usize>) {
851        let (_, upper) = self.iter.size_hint();
852        (0, upper)
853    }
854}
855
856impl<'a, T> Clone for SymmetricDifference<'a, T>
857where
858    T: PartialEq,
859{
860    fn clone(&self) -> SymmetricDifference<'a, T> {
861        SymmetricDifference {
862            iter: self.iter.clone(),
863        }
864    }
865}
866
867impl<'a, T> Iterator for SymmetricDifference<'a, T>
868where
869    T: PartialEq,
870{
871    type Item = &'a T;
872
873    fn next(&mut self) -> Option<&'a T> {
874        self.iter.next()
875    }
876    fn size_hint(&self) -> (usize, Option<usize>) {
877        self.iter.size_hint()
878    }
879}
880
881impl<'a, T> Clone for Union<'a, T>
882where
883    T: PartialEq,
884{
885    fn clone(&self) -> Union<'a, T> {
886        Union {
887            iter: self.iter.clone(),
888        }
889    }
890}
891
892impl<'a, T> Iterator for Union<'a, T>
893where
894    T: PartialEq,
895{
896    type Item = &'a T;
897
898    fn next(&mut self) -> Option<&'a T> {
899        self.iter.next()
900    }
901    fn size_hint(&self) -> (usize, Option<usize>) {
902        self.iter.size_hint()
903    }
904}
905
906#[allow(dead_code)]
907fn assert_covariance() {
908    fn set<'new>(v: VecSet<&'static str>) -> VecSet<&'new str> {
909        v
910    }
911    fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> {
912        v
913    }
914    fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> {
915        v
916    }
917    fn difference<'a, 'new>(v: Difference<'a, &'static str>) -> Difference<'a, &'new str> {
918        v
919    }
920    fn symmetric_difference<'a, 'new>(
921        v: SymmetricDifference<'a, &'static str>,
922    ) -> SymmetricDifference<'a, &'new str> {
923        v
924    }
925    fn intersection<'a, 'new>(v: Intersection<'a, &'static str>) -> Intersection<'a, &'new str> {
926        v
927    }
928    fn union<'a, 'new>(v: Union<'a, &'static str>) -> Union<'a, &'new str> {
929        v
930    }
931}