Skip to content

Commit 4353e44

Browse files
author
Michael Dagitses
committed
adding move_iter() function to collections::treemap::TreeSet
1 parent 72fc4a5 commit 4353e44

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/libcollections/treemap.rs

+37
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//! trees. The only requirement for the types is that the key implements
1313
//! `TotalOrd`.
1414
15+
use std::iter;
1516
use std::iter::{Peekable};
1617
use std::cmp::Ordering;
1718
use std::mem::{replace, swap};
@@ -618,6 +619,12 @@ impl<T: TotalOrd> TreeSet<T> {
618619
RevSetItems{iter: self.map.rev_iter()}
619620
}
620621

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+
621628
/// Get a lazy iterator pointing to the first value not less than `v` (greater or equal).
622629
/// If all elements in the set are less than `v` empty iterator is returned.
623630
#[inline]
@@ -665,6 +672,9 @@ pub struct RevSetItems<'a, T> {
665672
iter: RevEntries<'a, T, ()>
666673
}
667674

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+
668678
/// Lazy iterator producing elements in the set difference (in-order)
669679
pub struct DifferenceItems<'a, T> {
670680
a: Peekable<&'a T, SetItems<'a, T>>,
@@ -1542,6 +1552,33 @@ mod test_set {
15421552
}
15431553
}
15441554

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+
15451582
#[test]
15461583
fn test_clone_eq() {
15471584
let mut m = TreeSet::new();

0 commit comments

Comments
 (0)