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