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}