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}