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