@@ -306,6 +306,14 @@ pub struct Iter<'a, T: 'a> {
306
306
rx : & ' a Receiver < T >
307
307
}
308
308
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
+
309
317
/// The sending-half of Rust's asynchronous channel type. This half can only be
310
318
/// owned by one task, but it can be cloned to send to other tasks.
311
319
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -899,6 +907,29 @@ impl<'a, T> Iterator for Iter<'a, T> {
899
907
fn next ( & mut self ) -> Option < T > { self . rx . recv ( ) . ok ( ) }
900
908
}
901
909
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
+
902
933
#[ unsafe_destructor]
903
934
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
904
935
impl < T > Drop for Receiver < T > {
@@ -1507,6 +1538,32 @@ mod test {
1507
1538
assert_eq ! ( count_rx. recv( ) . unwrap( ) , 4 ) ;
1508
1539
}
1509
1540
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
+
1510
1567
#[ test]
1511
1568
fn try_recv_states ( ) {
1512
1569
let ( tx1, rx1) = channel :: < i32 > ( ) ;
0 commit comments