|
12 | 12 | //! trees. The only requirement for the types is that the key implements
|
13 | 13 | //! `TotalOrd`.
|
14 | 14 |
|
| 15 | +use std::iter; |
15 | 16 | use std::iter::{Peekable};
|
16 | 17 | use std::cmp::Ordering;
|
17 | 18 | use std::mem::{replace, swap};
|
@@ -618,6 +619,12 @@ impl<T: TotalOrd> TreeSet<T> {
|
618 | 619 | RevSetItems{iter: self.map.rev_iter()}
|
619 | 620 | }
|
620 | 621 |
|
| 622 | + /// Get a lazy iterator that consumes the set. |
| 623 | + #[inline] |
| 624 | + pub fn move_iter(self) -> MoveSetItems<T> { |
| 625 | + self.map.move_iter().map(|(value, _)| value) |
| 626 | + } |
| 627 | + |
621 | 628 | /// Get a lazy iterator pointing to the first value not less than `v` (greater or equal).
|
622 | 629 | /// If all elements in the set are less than `v` empty iterator is returned.
|
623 | 630 | #[inline]
|
@@ -665,6 +672,9 @@ pub struct RevSetItems<'a, T> {
|
665 | 672 | iter: RevEntries<'a, T, ()>
|
666 | 673 | }
|
667 | 674 |
|
| 675 | +/// Lazy forward iterator over a set that consumes the set while iterating |
| 676 | +pub type MoveSetItems<T> = iter::Map<'static, (T, ()), T, MoveEntries<T, ()>>; |
| 677 | + |
668 | 678 | /// Lazy iterator producing elements in the set difference (in-order)
|
669 | 679 | pub struct DifferenceItems<'a, T> {
|
670 | 680 | a: Peekable<&'a T, SetItems<'a, T>>,
|
@@ -1542,6 +1552,33 @@ mod test_set {
|
1542 | 1552 | }
|
1543 | 1553 | }
|
1544 | 1554 |
|
| 1555 | + #[test] |
| 1556 | + fn test_move_iter() { |
| 1557 | + let s: TreeSet<int> = range(0, 5).collect(); |
| 1558 | + |
| 1559 | + let mut n = 0; |
| 1560 | + for x in s.move_iter() { |
| 1561 | + assert_eq!(x, n); |
| 1562 | + n += 1; |
| 1563 | + } |
| 1564 | + } |
| 1565 | + |
| 1566 | + #[test] |
| 1567 | + fn test_move_iter_size_hint() { |
| 1568 | + let s: TreeSet<int> = vec!(0, 1).move_iter().collect(); |
| 1569 | + |
| 1570 | + let mut it = s.move_iter(); |
| 1571 | + |
| 1572 | + assert_eq!(it.size_hint(), (2, Some(2))); |
| 1573 | + assert!(it.next() != None); |
| 1574 | + |
| 1575 | + assert_eq!(it.size_hint(), (1, Some(1))); |
| 1576 | + assert!(it.next() != None); |
| 1577 | + |
| 1578 | + assert_eq!(it.size_hint(), (0, Some(0))); |
| 1579 | + assert_eq!(it.next(), None); |
| 1580 | + } |
| 1581 | + |
1545 | 1582 | #[test]
|
1546 | 1583 | fn test_clone_eq() {
|
1547 | 1584 | let mut m = TreeSet::new();
|
|
0 commit comments