Skip to content

Commit 5eaf178

Browse files
Nemo157cramertj
authored andcommitted
Align io::Cursor implementations with std
Instead of providing a generic `AsyncWrite` implementation delegate the specific implementations of `Write`.
1 parent 7a74262 commit 5eaf178

File tree

4 files changed

+40
-46
lines changed

4 files changed

+40
-46
lines changed

futures-io/src/lib.rs

+11-29
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ compile_error!("The `read_initializer` feature requires the `unstable` feature a
2626

2727
#[cfg(feature = "std")]
2828
mod if_std {
29-
use std::cmp;
3029
use std::io;
3130
use std::ops::DerefMut;
3231
use std::pin::Pin;
@@ -472,37 +471,20 @@ mod if_std {
472471
}
473472
}
474473

475-
impl<T: AsMut<[u8]> + Unpin> AsyncWrite for io::Cursor<T> {
476-
fn poll_write(
477-
mut self: Pin<&mut Self>,
478-
_: &mut Context<'_>,
479-
buf: &[u8],
480-
) -> Poll<Result<usize>> {
481-
let position = self.position();
482-
let result = {
483-
let out = (&mut *self).get_mut().as_mut();
484-
let pos = cmp::min(out.len() as u64, position) as usize;
485-
io::Write::write(&mut &mut out[pos..], buf)
486-
};
487-
if let Ok(offset) = result {
488-
self.get_mut().set_position(position + offset as u64);
489-
}
490-
Poll::Ready(result)
491-
}
474+
impl AsyncWrite for io::Cursor<&mut [u8]> {
475+
delegate_async_write_to_stdio!();
476+
}
492477

493-
fn poll_write_vectored(self: Pin<&mut Self>, _: &mut Context<'_>, bufs: &[IoSlice<'_>])
494-
-> Poll<Result<usize>>
495-
{
496-
Poll::Ready(io::Write::write_vectored(&mut self.get_mut().get_mut().as_mut(), bufs))
497-
}
478+
impl AsyncWrite for io::Cursor<&mut Vec<u8>> {
479+
delegate_async_write_to_stdio!();
480+
}
498481

499-
fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Result<()>> {
500-
Poll::Ready(io::Write::flush(&mut self.get_mut().get_mut().as_mut()))
501-
}
482+
impl AsyncWrite for io::Cursor<Vec<u8>> {
483+
delegate_async_write_to_stdio!();
484+
}
502485

503-
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
504-
self.poll_flush(cx)
505-
}
486+
impl AsyncWrite for io::Cursor<Box<[u8]>> {
487+
delegate_async_write_to_stdio!();
506488
}
507489

508490
impl AsyncWrite for Vec<u8> {

futures-test/src/io/write/mod.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ pub trait AsyncWriteTestExt: AsyncWrite {
1919
/// use futures_test::io::AsyncWriteTestExt;
2020
/// use futures::pin_mut;
2121
///
22-
/// let writer = std::io::Cursor::new([0u8; 4]).interleave_pending_write();
22+
/// let writer = std::io::Cursor::new(vec![0u8; 4].into_boxed_slice()).interleave_pending_write();
2323
/// pin_mut!(writer);
2424
///
2525
/// let mut cx = noop_context();
2626
///
2727
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[1, 2])?, Poll::Pending);
2828
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[1, 2])?, Poll::Ready(2));
29-
/// assert_eq!(writer.get_ref().get_ref(), &[1, 2, 0, 0]);
29+
/// assert_eq!(&writer.get_ref().get_ref()[..], [1, 2, 0, 0]);
3030
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[3, 4])?, Poll::Pending);
3131
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[3, 4])?, Poll::Ready(2));
32-
/// assert_eq!(writer.get_ref().get_ref(), &[1, 2, 3, 4]);
32+
/// assert_eq!(&writer.get_ref().get_ref()[..], [1, 2, 3, 4]);
3333
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[5, 6])?, Poll::Pending);
3434
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[5, 6])?, Poll::Ready(0));
3535
///
@@ -59,17 +59,17 @@ pub trait AsyncWriteTestExt: AsyncWrite {
5959
/// use futures_test::io::AsyncWriteTestExt;
6060
/// use futures::pin_mut;
6161
///
62-
/// let writer = std::io::Cursor::new([0u8; 4]).limited_write(2);
62+
/// let writer = std::io::Cursor::new(vec![0u8; 4].into_boxed_slice()).limited_write(2);
6363
/// pin_mut!(writer);
6464
///
6565
/// let mut cx = noop_context();
6666
///
6767
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[1, 2])?, Poll::Ready(2));
68-
/// assert_eq!(writer.get_ref().get_ref(), &[1, 2, 0, 0]);
68+
/// assert_eq!(&writer.get_ref().get_ref()[..], [1, 2, 0, 0]);
6969
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[3])?, Poll::Ready(1));
70-
/// assert_eq!(writer.get_ref().get_ref(), &[1, 2, 3, 0]);
70+
/// assert_eq!(&writer.get_ref().get_ref()[..], [1, 2, 3, 0]);
7171
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[4, 5])?, Poll::Ready(1));
72-
/// assert_eq!(writer.get_ref().get_ref(), &[1, 2, 3, 4]);
72+
/// assert_eq!(&writer.get_ref().get_ref()[..], [1, 2, 3, 4]);
7373
/// assert_eq!(writer.as_mut().poll_write(&mut cx, &[5])?, Poll::Ready(0));
7474
///
7575
/// # Ok::<(), std::io::Error>(())

futures-util/src/io/mod.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ pub trait AsyncReadExt: AsyncRead {
172172
/// use std::io::Cursor;
173173
///
174174
/// let reader = Cursor::new([1, 2, 3, 4]);
175-
/// let mut writer = Cursor::new([0u8; 5]);
175+
/// let mut writer = Cursor::new(vec![0u8; 5]);
176176
///
177177
/// let bytes = reader.copy_into(&mut writer).await?;
178178
/// writer.close().await?;
@@ -354,8 +354,8 @@ pub trait AsyncReadExt: AsyncRead {
354354
/// // implement both `AsyncRead` and `AsyncWrite`.
355355
///
356356
/// let reader = Cursor::new([1, 2, 3, 4]);
357-
/// let mut buffer = Cursor::new([0, 0, 0, 0, 5, 6, 7, 8]);
358-
/// let mut writer = Cursor::new([0u8; 5]);
357+
/// let mut buffer = Cursor::new(vec![0, 0, 0, 0, 5, 6, 7, 8]);
358+
/// let mut writer = Cursor::new(vec![0u8; 5]);
359359
///
360360
/// {
361361
/// let (buffer_reader, mut buffer_writer) = (&mut buffer).split();
@@ -426,10 +426,10 @@ pub trait AsyncWriteExt: AsyncWrite {
426426
/// use futures::io::{AllowStdIo, AsyncWriteExt};
427427
/// use std::io::{BufWriter, Cursor};
428428
///
429-
/// let mut output = [0u8; 5];
429+
/// let mut output = vec![0u8; 5];
430430
///
431431
/// {
432-
/// let writer = Cursor::new(&mut output[..]);
432+
/// let writer = Cursor::new(&mut output);
433433
/// let mut buffered = AllowStdIo::new(BufWriter::new(writer));
434434
/// buffered.write_all(&[1, 2]).await?;
435435
/// buffered.write_all(&[3, 4]).await?;
@@ -487,7 +487,7 @@ pub trait AsyncWriteExt: AsyncWrite {
487487
/// use futures::io::AsyncWriteExt;
488488
/// use std::io::Cursor;
489489
///
490-
/// let mut writer = Cursor::new([0u8; 5]);
490+
/// let mut writer = Cursor::new(vec![0u8; 5]);
491491
///
492492
/// writer.write_all(&[1, 2, 3, 4]).await?;
493493
///
@@ -582,7 +582,7 @@ pub trait AsyncBufReadExt: AsyncBufRead {
582582
/// use std::io::Cursor;
583583
///
584584
/// let reader = Cursor::new([1, 2, 3, 4]);
585-
/// let mut writer = Cursor::new([0u8; 5]);
585+
/// let mut writer = Cursor::new(vec![0u8; 5]);
586586
///
587587
/// let bytes = reader.copy_buf_into(&mut writer).await?;
588588
/// writer.close().await?;

futures/tests/io_cursor.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,25 @@ use std::io::Cursor;
66
use std::pin::Pin;
77

88
#[test]
9-
fn cursor_asyncwrite_asmut() {
10-
let mut cursor = Cursor::new([0; 5]);
9+
fn cursor_asyncwrite_vec() {
10+
let mut cursor = Cursor::new(vec![0; 5]);
11+
futures::executor::block_on(lazy(|cx| {
12+
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[1, 2]), Poll::Ready(Ok(2)));
13+
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[3, 4]), Poll::Ready(Ok(2)));
14+
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[5, 6]), Poll::Ready(Ok(2)));
15+
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[6, 7]), Poll::Ready(Ok(2)));
16+
}));
17+
assert_eq!(cursor.into_inner(), [1, 2, 3, 4, 5, 6, 6, 7]);
18+
}
19+
20+
#[test]
21+
fn cursor_asyncwrite_box() {
22+
let mut cursor = Cursor::new(vec![0; 5].into_boxed_slice());
1123
futures::executor::block_on(lazy(|cx| {
1224
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[1, 2]), Poll::Ready(Ok(2)));
1325
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[3, 4]), Poll::Ready(Ok(2)));
1426
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[5, 6]), Poll::Ready(Ok(1)));
1527
assert_matches!(Pin::new(&mut cursor).poll_write(cx, &[6, 7]), Poll::Ready(Ok(0)));
1628
}));
17-
assert_eq!(cursor.into_inner(), [1, 2, 3, 4, 5]);
29+
assert_eq!(&*cursor.into_inner(), [1, 2, 3, 4, 5]);
1830
}

0 commit comments

Comments
 (0)