@@ -18,6 +18,7 @@ mod if_std {
18
18
use std:: boxed:: Box ;
19
19
use std:: cmp;
20
20
use std:: io as StdIo ;
21
+ use std:: pin:: Pin ;
21
22
use std:: ptr;
22
23
23
24
// Re-export IoVec for convenience
@@ -108,7 +109,7 @@ mod if_std {
108
109
/// `Interrupted`. Implementations must convert `WouldBlock` into
109
110
/// `Async::Pending` and either internally retry or convert
110
111
/// `Interrupted` into another error kind.
111
- fn poll_read ( & mut self , waker : & Waker , buf : & mut [ u8 ] )
112
+ fn poll_read ( self : Pin < & mut Self > , waker : & Waker , buf : & mut [ u8 ] )
112
113
-> Poll < Result < usize > > ;
113
114
114
115
/// Attempt to read from the `AsyncRead` into `vec` using vectored
@@ -133,7 +134,7 @@ mod if_std {
133
134
/// `Interrupted`. Implementations must convert `WouldBlock` into
134
135
/// `Async::Pending` and either internally retry or convert
135
136
/// `Interrupted` into another error kind.
136
- fn poll_vectored_read ( & mut self , waker : & Waker , vec : & mut [ & mut IoVec ] )
137
+ fn poll_vectored_read ( self : Pin < & mut Self > , waker : & Waker , vec : & mut [ & mut IoVec ] )
137
138
-> Poll < Result < usize > >
138
139
{
139
140
if let Some ( ref mut first_iovec) = vec. get_mut ( 0 ) {
@@ -168,7 +169,7 @@ mod if_std {
168
169
/// `Interrupted`. Implementations must convert `WouldBlock` into
169
170
/// `Async::Pending` and either internally retry or convert
170
171
/// `Interrupted` into another error kind.
171
- fn poll_write ( & mut self , waker : & Waker , buf : & [ u8 ] )
172
+ fn poll_write ( self : Pin < & mut Self > , waker : & Waker , buf : & [ u8 ] )
172
173
-> Poll < Result < usize > > ;
173
174
174
175
/// Attempt to write bytes from `vec` into the object using vectored
@@ -194,7 +195,7 @@ mod if_std {
194
195
/// `Interrupted`. Implementations must convert `WouldBlock` into
195
196
/// `Async::Pending` and either internally retry or convert
196
197
/// `Interrupted` into another error kind.
197
- fn poll_vectored_write ( & mut self , waker : & Waker , vec : & [ & IoVec ] )
198
+ fn poll_vectored_write ( self : Pin < & mut Self > , waker : & Waker , vec : & [ & IoVec ] )
198
199
-> Poll < Result < usize > >
199
200
{
200
201
if let Some ( ref first_iovec) = vec. get ( 0 ) {
@@ -221,7 +222,7 @@ mod if_std {
221
222
/// `Interrupted`. Implementations must convert `WouldBlock` into
222
223
/// `Async::Pending` and either internally retry or convert
223
224
/// `Interrupted` into another error kind.
224
- fn poll_flush ( & mut self , waker : & Waker ) -> Poll < Result < ( ) > > ;
225
+ fn poll_flush ( self : Pin < & mut Self > , waker : & Waker ) -> Poll < Result < ( ) > > ;
225
226
226
227
/// Attempt to close the object.
227
228
///
@@ -238,7 +239,7 @@ mod if_std {
238
239
/// `Interrupted`. Implementations must convert `WouldBlock` into
239
240
/// `Async::Pending` and either internally retry or convert
240
241
/// `Interrupted` into another error kind.
241
- fn poll_close ( & mut self , waker : & Waker ) -> Poll < Result < ( ) > > ;
242
+ fn poll_close ( self : Pin < & mut Self > , waker : & Waker ) -> Poll < Result < ( ) > > ;
242
243
}
243
244
244
245
macro_rules! deref_async_read {
@@ -247,25 +248,25 @@ mod if_std {
247
248
( * * self ) . initializer( )
248
249
}
249
250
250
- fn poll_read( & mut self , waker: & Waker , buf: & mut [ u8 ] )
251
+ fn poll_read( mut self : Pin < & mut Self > , waker: & Waker , buf: & mut [ u8 ] )
251
252
-> Poll <Result <usize >>
252
253
{
253
- ( * * self ) . poll_read( waker, buf)
254
+ Pin :: new ( & mut * * self ) . poll_read( waker, buf)
254
255
}
255
256
256
- fn poll_vectored_read( & mut self , waker: & Waker , vec: & mut [ & mut IoVec ] )
257
+ fn poll_vectored_read( mut self : Pin < & mut Self > , waker: & Waker , vec: & mut [ & mut IoVec ] )
257
258
-> Poll <Result <usize >>
258
259
{
259
- ( * * self ) . poll_vectored_read( waker, vec)
260
+ Pin :: new ( & mut * * self ) . poll_vectored_read( waker, vec)
260
261
}
261
262
}
262
263
}
263
264
264
- impl < T : ?Sized + AsyncRead > AsyncRead for Box < T > {
265
+ impl < T : ?Sized + AsyncRead + Unpin > AsyncRead for Box < T > {
265
266
deref_async_read ! ( ) ;
266
267
}
267
268
268
- impl < ' a , T : ?Sized + AsyncRead > AsyncRead for & ' a mut T {
269
+ impl < ' a , T : ?Sized + AsyncRead + Unpin > AsyncRead for & ' a mut T {
269
270
deref_async_read ! ( ) ;
270
271
}
271
272
@@ -277,10 +278,10 @@ mod if_std {
277
278
Initializer :: nop( )
278
279
}
279
280
280
- fn poll_read( & mut self , _: & Waker , buf: & mut [ u8 ] )
281
+ fn poll_read( mut self : Pin < & mut Self > , _: & Waker , buf: & mut [ u8 ] )
281
282
-> Poll <Result <usize >>
282
283
{
283
- Poll :: Ready ( StdIo :: Read :: read( self , buf) )
284
+ Poll :: Ready ( StdIo :: Read :: read( & mut * self , buf) )
284
285
}
285
286
}
286
287
}
@@ -293,83 +294,105 @@ mod if_std {
293
294
unsafe_delegate_async_read_to_stdio ! ( ) ;
294
295
}
295
296
296
- impl < T : AsRef < [ u8 ] > > AsyncRead for StdIo :: Cursor < T > {
297
+ impl < T : AsRef < [ u8 ] > + Unpin > AsyncRead for StdIo :: Cursor < T > {
297
298
unsafe_delegate_async_read_to_stdio ! ( ) ;
298
299
}
299
300
300
301
macro_rules! deref_async_write {
301
302
( ) => {
302
- fn poll_write( & mut self , waker: & Waker , buf: & [ u8 ] )
303
+ fn poll_write( mut self : Pin < & mut Self > , waker: & Waker , buf: & [ u8 ] )
303
304
-> Poll <Result <usize >>
304
305
{
305
- ( * * self ) . poll_write( waker, buf)
306
+ Pin :: new ( & mut * * self ) . poll_write( waker, buf)
306
307
}
307
308
308
- fn poll_vectored_write( & mut self , waker: & Waker , vec: & [ & IoVec ] )
309
+ fn poll_vectored_write( mut self : Pin < & mut Self > , waker: & Waker , vec: & [ & IoVec ] )
309
310
-> Poll <Result <usize >>
310
311
{
311
- ( * * self ) . poll_vectored_write( waker, vec)
312
+ Pin :: new ( & mut * * self ) . poll_vectored_write( waker, vec)
312
313
}
313
314
314
- fn poll_flush( & mut self , waker: & Waker ) -> Poll <Result <( ) >> {
315
- ( * * self ) . poll_flush( waker)
315
+ fn poll_flush( mut self : Pin < & mut Self > , waker: & Waker ) -> Poll <Result <( ) >> {
316
+ Pin :: new ( & mut * * self ) . poll_flush( waker)
316
317
}
317
318
318
- fn poll_close( & mut self , waker: & Waker ) -> Poll <Result <( ) >> {
319
- ( * * self ) . poll_close( waker)
319
+ fn poll_close( mut self : Pin < & mut Self > , waker: & Waker ) -> Poll <Result <( ) >> {
320
+ Pin :: new ( & mut * * self ) . poll_close( waker)
320
321
}
321
322
}
322
323
}
323
324
324
- impl < T : ?Sized + AsyncWrite > AsyncWrite for Box < T > {
325
+ impl < T : ?Sized + AsyncWrite + Unpin > AsyncWrite for Box < T > {
325
326
deref_async_write ! ( ) ;
326
327
}
327
328
328
- impl < ' a , T : ?Sized + AsyncWrite > AsyncWrite for & ' a mut T {
329
+ impl < ' a , T : ?Sized + AsyncWrite + Unpin > AsyncWrite for & ' a mut T {
329
330
deref_async_write ! ( ) ;
330
331
}
331
332
333
+ impl < ' a , T : ?Sized + AsyncWrite > AsyncWrite for Pin < & ' a mut T > {
334
+ fn poll_write ( mut self : Pin < & mut Self > , waker : & Waker , buf : & [ u8 ] )
335
+ -> Poll < Result < usize > >
336
+ {
337
+ T :: poll_write ( ( * self ) . as_mut ( ) , waker, buf)
338
+ }
339
+
340
+ fn poll_vectored_write ( mut self : Pin < & mut Self > , waker : & Waker , vec : & [ & IoVec ] )
341
+ -> Poll < Result < usize > >
342
+ {
343
+ T :: poll_vectored_write ( ( * self ) . as_mut ( ) , waker, vec)
344
+ }
345
+
346
+ fn poll_flush ( mut self : Pin < & mut Self > , waker : & Waker ) -> Poll < Result < ( ) > > {
347
+ T :: poll_flush ( ( * self ) . as_mut ( ) , waker)
348
+ }
349
+
350
+ fn poll_close ( mut self : Pin < & mut Self > , waker : & Waker ) -> Poll < Result < ( ) > > {
351
+ T :: poll_close ( ( * self ) . as_mut ( ) , waker)
352
+ }
353
+ }
354
+
332
355
macro_rules! delegate_async_write_to_stdio {
333
356
( ) => {
334
- fn poll_write( & mut self , _: & Waker , buf: & [ u8 ] )
357
+ fn poll_write( mut self : Pin < & mut Self > , _: & Waker , buf: & [ u8 ] )
335
358
-> Poll <Result <usize >>
336
359
{
337
- Poll :: Ready ( StdIo :: Write :: write( self , buf) )
360
+ Poll :: Ready ( StdIo :: Write :: write( & mut * self , buf) )
338
361
}
339
362
340
- fn poll_flush( & mut self , _: & Waker ) -> Poll <Result <( ) >> {
341
- Poll :: Ready ( StdIo :: Write :: flush( self ) )
363
+ fn poll_flush( mut self : Pin < & mut Self > , _: & Waker ) -> Poll <Result <( ) >> {
364
+ Poll :: Ready ( StdIo :: Write :: flush( & mut * self ) )
342
365
}
343
366
344
- fn poll_close( & mut self , waker: & Waker ) -> Poll <Result <( ) >> {
367
+ fn poll_close( self : Pin < & mut Self > , waker: & Waker ) -> Poll <Result <( ) >> {
345
368
self . poll_flush( waker)
346
369
}
347
370
}
348
371
}
349
372
350
- impl < T : AsMut < [ u8 ] > > AsyncWrite for StdIo :: Cursor < T > {
373
+ impl < T : AsMut < [ u8 ] > + Unpin > AsyncWrite for StdIo :: Cursor < T > {
351
374
fn poll_write (
352
- & mut self ,
375
+ mut self : Pin < & mut Self > ,
353
376
_: & Waker ,
354
377
buf : & [ u8 ] ,
355
378
) -> Poll < Result < usize > > {
356
379
let position = self . position ( ) ;
357
380
let result = {
358
- let out = self . get_mut ( ) . as_mut ( ) ;
381
+ let out = ( & mut * self ) . get_mut ( ) . as_mut ( ) ;
359
382
let pos = cmp:: min ( out. len ( ) as u64 , position) as usize ;
360
383
StdIo :: Write :: write ( & mut & mut out[ pos..] , buf)
361
384
} ;
362
385
if let Ok ( offset) = result {
363
- self . set_position ( position + offset as u64 ) ;
386
+ self . get_mut ( ) . set_position ( position + offset as u64 ) ;
364
387
}
365
388
Poll :: Ready ( result)
366
389
}
367
390
368
- fn poll_flush ( & mut self , _: & Waker ) -> Poll < Result < ( ) > > {
369
- Poll :: Ready ( StdIo :: Write :: flush ( & mut self . get_mut ( ) . as_mut ( ) ) )
391
+ fn poll_flush ( self : Pin < & mut Self > , _: & Waker ) -> Poll < Result < ( ) > > {
392
+ Poll :: Ready ( StdIo :: Write :: flush ( & mut self . get_mut ( ) . get_mut ( ) . as_mut ( ) ) )
370
393
}
371
394
372
- fn poll_close ( & mut self , waker : & Waker ) -> Poll < Result < ( ) > > {
395
+ fn poll_close ( self : Pin < & mut Self > , waker : & Waker ) -> Poll < Result < ( ) > > {
373
396
self . poll_flush ( waker)
374
397
}
375
398
}
0 commit comments