Skip to main content

vector_map/
set.rs

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