File tree 3 files changed +12
-22
lines changed
futures-util/src/stream/futures_unordered
3 files changed +12
-22
lines changed Original file line number Diff line number Diff line change 1
- use std:: marker:: { PhantomData , Unpin } ;
2
- use super :: FuturesUnordered ;
3
- use super :: node:: Node ;
1
+ use std:: marker:: Unpin ;
2
+ use std:: mem:: PinMut ;
3
+
4
+ use super :: iter_pin_mut:: IterPinMut ;
4
5
5
6
#[ derive( Debug ) ]
6
7
/// Mutable iterator over all futures in the unordered set.
7
- pub struct IterMut < ' a , F : ' a + Unpin > {
8
- pub ( super ) node : * const Node < F > ,
9
- pub ( super ) len : usize ,
10
- pub ( super ) _marker : PhantomData < & ' a mut FuturesUnordered < F > >
11
- }
8
+ pub struct IterMut < ' a , F : ' a + Unpin > ( pub ( super ) IterPinMut < ' a , F > ) ;
12
9
13
10
impl < ' a , F : Unpin > Iterator for IterMut < ' a , F > {
14
11
type Item = & ' a mut F ;
15
12
16
13
fn next ( & mut self ) -> Option < & ' a mut F > {
17
- if self . node . is_null ( ) {
18
- return None ;
19
- }
20
- unsafe {
21
- let future = ( * ( * self . node ) . future . get ( ) ) . as_mut ( ) . unwrap ( ) ;
22
- let next = * ( * self . node ) . next_all . get ( ) ;
23
- self . node = next;
24
- self . len -= 1 ;
25
- Some ( future)
26
- }
14
+ self . 0 . next ( ) . map ( |f| unsafe { PinMut :: get_mut ( f) } )
27
15
}
28
16
29
17
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
30
- ( self . len , Some ( self . len ) )
18
+ self . 0 . size_hint ( )
31
19
}
32
20
}
33
21
Original file line number Diff line number Diff line change 1
- use std:: marker:: PhantomData ;
1
+ use std:: marker:: { PhantomData , Unpin } ;
2
2
use std:: mem:: PinMut ;
3
3
4
4
use super :: FuturesUnordered ;
@@ -12,6 +12,8 @@ pub struct IterPinMut<'a, F: 'a> {
12
12
pub ( super ) _marker : PhantomData < & ' a mut FuturesUnordered < F > >
13
13
}
14
14
15
+ impl < ' a , F : Unpin > Unpin for IterPinMut < ' a , F > { }
16
+
15
17
impl < ' a , F > Iterator for IterPinMut < ' a , F > {
16
18
type Item = PinMut < ' a , F > ;
17
19
Original file line number Diff line number Diff line change @@ -150,11 +150,11 @@ impl<T> FuturesUnordered<T> {
150
150
151
151
/// Returns an iterator that allows modifying each future in the set.
152
152
pub fn iter_mut ( & mut self ) -> IterMut < T > where T : Unpin {
153
- IterMut {
153
+ IterMut ( IterPinMut {
154
154
node : self . head_all ,
155
155
len : self . len ,
156
156
_marker : PhantomData
157
- }
157
+ } )
158
158
}
159
159
160
160
/// Returns an iterator that allows modifying each future in the set.
You can’t perform that action at this time.
0 commit comments