Skip to content

Commit 97c58c1

Browse files
committed
Implement IntoIterator for Receiver
1 parent 5c96369 commit 97c58c1

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/libstd/sync/mpsc/mod.rs

+57
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,14 @@ pub struct Iter<'a, T: 'a> {
306306
rx: &'a Receiver<T>
307307
}
308308

309+
/// An owning iterator over messages on a receiver, this iterator will block
310+
/// whenever `next` is called, waiting for a new message, and `None` will be
311+
/// returned when the corresponding channel has hung up.
312+
#[stable(feature = "receiver_into_iter", since = "1.1.0")]
313+
pub struct IntoIter<T> {
314+
rx: Receiver<T>
315+
}
316+
309317
/// The sending-half of Rust's asynchronous channel type. This half can only be
310318
/// owned by one task, but it can be cloned to send to other tasks.
311319
#[stable(feature = "rust1", since = "1.0.0")]
@@ -899,6 +907,29 @@ impl<'a, T> Iterator for Iter<'a, T> {
899907
fn next(&mut self) -> Option<T> { self.rx.recv().ok() }
900908
}
901909

910+
#[stable(feature = "rust1_1", since = "1.1.0")]
911+
impl<'a, T> IntoIterator for &'a Receiver<T> {
912+
type Item = T;
913+
type IntoIter = Iter<'a, T>;
914+
915+
fn into_iter(self) -> Iter<'a, T> { self.iter() }
916+
}
917+
918+
impl<T> Iterator for IntoIter<T> {
919+
type Item = T;
920+
fn next(&mut self) -> Option<T> { self.rx.recv().ok() }
921+
}
922+
923+
#[stable(feature = "receiver_into_iter", since = "1.1.0")]
924+
impl <T> IntoIterator for Receiver<T> {
925+
type Item = T;
926+
type IntoIter = IntoIter<T>;
927+
928+
fn into_iter(self) -> IntoIter<T> {
929+
IntoIter { rx: self }
930+
}
931+
}
932+
902933
#[unsafe_destructor]
903934
#[stable(feature = "rust1", since = "1.0.0")]
904935
impl<T> Drop for Receiver<T> {
@@ -1507,6 +1538,32 @@ mod test {
15071538
assert_eq!(count_rx.recv().unwrap(), 4);
15081539
}
15091540

1541+
#[test]
1542+
fn test_recv_into_iter_owned() {
1543+
let mut iter = {
1544+
let (tx, rx) = channel::<i32>();
1545+
tx.send(1).unwrap();
1546+
tx.send(2).unwrap();
1547+
1548+
rx.into_iter()
1549+
};
1550+
assert_eq!(iter.next().unwrap(), 1);
1551+
assert_eq!(iter.next().unwrap(), 2);
1552+
assert_eq!(iter.next().is_none(), true);
1553+
}
1554+
1555+
#[test]
1556+
fn test_recv_into_iter_borrowed() {
1557+
let (tx, rx) = channel::<i32>();
1558+
tx.send(1).unwrap();
1559+
tx.send(2).unwrap();
1560+
drop(tx);
1561+
let mut iter = (&rx).into_iter();
1562+
assert_eq!(iter.next().unwrap(), 1);
1563+
assert_eq!(iter.next().unwrap(), 2);
1564+
assert_eq!(iter.next().is_none(), true);
1565+
}
1566+
15101567
#[test]
15111568
fn try_recv_states() {
15121569
let (tx1, rx1) = channel::<i32>();

0 commit comments

Comments
 (0)