Skip to content

Commit 75b1398

Browse files
committed
Pass through AsyncRead and AsyncWrite
1 parent 9d9fe02 commit 75b1398

File tree

16 files changed

+342
-11
lines changed

16 files changed

+342
-11
lines changed

src/futures/bufread/generic/decoder.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use core::{
22
pin::Pin,
33
task::{Context, Poll},
44
};
5-
use std::io::Result;
5+
use std::io::{IoSlice, Result};
66

77
use crate::{codec::Decode, util::PartialBuffer};
88
use futures_core::ready;
9-
use futures_io::{AsyncBufRead, AsyncRead};
9+
use futures_io::{AsyncBufRead, AsyncRead, AsyncWrite};
1010
use pin_project_lite::pin_project;
1111

1212
#[derive(Debug)]
@@ -158,3 +158,25 @@ impl<R: AsyncBufRead, D: Decode> AsyncRead for Decoder<R, D> {
158158
}
159159
}
160160
}
161+
162+
impl<R: AsyncWrite, D: Decode> AsyncWrite for Decoder<R, D> {
163+
fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<Result<usize>> {
164+
self.project().reader.poll_write(cx, buf)
165+
}
166+
167+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
168+
self.project().reader.poll_flush(cx)
169+
}
170+
171+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
172+
self.project().reader.poll_close(cx)
173+
}
174+
175+
fn poll_write_vectored(
176+
self: Pin<&mut Self>,
177+
cx: &mut Context<'_>,
178+
bufs: &[IoSlice<'_>],
179+
) -> Poll<Result<usize>> {
180+
self.project().reader.poll_write_vectored(cx, bufs)
181+
}
182+
}

src/futures/bufread/generic/encoder.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::io::Result;
66

77
use crate::{codec::Encode, util::PartialBuffer};
88
use futures_core::ready;
9-
use futures_io::{AsyncBufRead, AsyncRead};
9+
use futures_io::{AsyncBufRead, AsyncRead, AsyncWrite, IoSlice};
1010
use pin_project_lite::pin_project;
1111

1212
#[derive(Debug)]
@@ -115,3 +115,25 @@ impl<R: AsyncBufRead, E: Encode> AsyncRead for Encoder<R, E> {
115115
}
116116
}
117117
}
118+
119+
impl<R: AsyncWrite, E: Encode> AsyncWrite for Encoder<R, E> {
120+
fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<Result<usize>> {
121+
self.project().reader.poll_write(cx, buf)
122+
}
123+
124+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
125+
self.project().reader.poll_flush(cx)
126+
}
127+
128+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
129+
self.project().reader.poll_close(cx)
130+
}
131+
132+
fn poll_write_vectored(
133+
self: Pin<&mut Self>,
134+
cx: &mut Context<'_>,
135+
bufs: &[IoSlice<'_>],
136+
) -> Poll<Result<usize>> {
137+
self.project().reader.poll_write_vectored(cx, bufs)
138+
}
139+
}

src/futures/bufread/macros/decoder.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,38 @@ macro_rules! decoder {
7272
}
7373
}
7474

75+
impl<$inner: futures_io::AsyncWrite> futures_io::AsyncWrite for $name<$inner> {
76+
fn poll_write(
77+
self: std::pin::Pin<&mut Self>,
78+
cx: &mut std::task::Context<'_>,
79+
buf: &[u8],
80+
) -> std::task::Poll<std::io::Result<usize>> {
81+
self.project().inner.poll_write(cx, buf)
82+
}
83+
84+
fn poll_flush(
85+
self: std::pin::Pin<&mut Self>,
86+
cx: &mut std::task::Context<'_>,
87+
) -> std::task::Poll<std::io::Result<()>> {
88+
self.project().inner.poll_flush(cx)
89+
}
90+
91+
fn poll_close(
92+
self: std::pin::Pin<&mut Self>,
93+
cx: &mut std::task::Context<'_>,
94+
) -> std::task::Poll<std::io::Result<()>> {
95+
self.project().inner.poll_flush(cx)
96+
}
97+
98+
fn poll_write_vectored(
99+
self: std::pin::Pin<&mut Self>,
100+
cx: &mut std::task::Context<'_>,
101+
bufs: &[std::io::IoSlice<'_>]
102+
) -> std::task::Poll<std::io::Result<usize>> {
103+
self.project().inner.poll_write_vectored(cx, bufs)
104+
}
105+
}
106+
75107
const _: () = {
76108
fn _assert() {
77109
use crate::util::{_assert_send, _assert_sync};

src/futures/bufread/macros/encoder.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,38 @@ macro_rules! encoder {
6262
}
6363
}
6464

65+
impl<$inner: futures_io::AsyncWrite> futures_io::AsyncWrite for $name<$inner> {
66+
fn poll_write(
67+
self: std::pin::Pin<&mut Self>,
68+
cx: &mut std::task::Context<'_>,
69+
buf: &[u8],
70+
) -> std::task::Poll<std::io::Result<usize>> {
71+
self.project().inner.poll_write(cx, buf)
72+
}
73+
74+
fn poll_flush(
75+
self: std::pin::Pin<&mut Self>,
76+
cx: &mut std::task::Context<'_>,
77+
) -> std::task::Poll<std::io::Result<()>> {
78+
self.project().inner.poll_flush(cx)
79+
}
80+
81+
fn poll_close(
82+
self: std::pin::Pin<&mut Self>,
83+
cx: &mut std::task::Context<'_>,
84+
) -> std::task::Poll<std::io::Result<()>> {
85+
self.project().inner.poll_flush(cx)
86+
}
87+
88+
fn poll_write_vectored(
89+
self: std::pin::Pin<&mut Self>,
90+
cx: &mut std::task::Context<'_>,
91+
bufs: &[std::io::IoSlice<'_>]
92+
) -> std::task::Poll<std::io::Result<usize>> {
93+
self.project().inner.poll_write_vectored(cx, bufs)
94+
}
95+
}
96+
6597
const _: () = {
6698
fn _assert() {
6799
use crate::util::{_assert_send, _assert_sync};

src/futures/write/generic/decoder.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
util::PartialBuffer,
1111
};
1212
use futures_core::ready;
13-
use futures_io::AsyncWrite;
13+
use futures_io::{AsyncRead, AsyncWrite, IoSliceMut};
1414
use pin_project_lite::pin_project;
1515

1616
#[derive(Debug)]
@@ -182,3 +182,21 @@ impl<W: AsyncWrite, D: Decode> AsyncWrite for Decoder<W, D> {
182182
}
183183
}
184184
}
185+
186+
impl<W: AsyncWrite + AsyncRead, D: Decode> AsyncRead for Decoder<W, D> {
187+
fn poll_read(
188+
self: Pin<&mut Self>,
189+
cx: &mut Context<'_>,
190+
buf: &mut [u8],
191+
) -> Poll<io::Result<usize>> {
192+
self.get_pin_mut().poll_read(cx, buf)
193+
}
194+
195+
fn poll_read_vectored(
196+
self: Pin<&mut Self>,
197+
cx: &mut Context<'_>,
198+
bufs: &mut [IoSliceMut<'_>],
199+
) -> Poll<io::Result<usize>> {
200+
self.get_pin_mut().poll_read_vectored(cx, bufs)
201+
}
202+
}

src/futures/write/generic/encoder.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
util::PartialBuffer,
1111
};
1212
use futures_core::ready;
13-
use futures_io::AsyncWrite;
13+
use futures_io::{AsyncRead, AsyncWrite, IoSliceMut};
1414
use pin_project_lite::pin_project;
1515

1616
#[derive(Debug)]
@@ -179,3 +179,24 @@ impl<W: AsyncWrite, E: Encode> AsyncWrite for Encoder<W, E> {
179179
Poll::Ready(Ok(()))
180180
}
181181
}
182+
183+
impl<W: AsyncWrite + AsyncRead, E: Encode> AsyncRead for Encoder<W, E> {
184+
fn poll_read(
185+
self: Pin<&mut Self>,
186+
cx: &mut Context<'_>,
187+
buf: &mut [u8],
188+
) -> Poll<io::Result<usize>> {
189+
self.project().writer.get_pin_mut().poll_read(cx, buf)
190+
}
191+
192+
fn poll_read_vectored(
193+
self: Pin<&mut Self>,
194+
cx: &mut Context<'_>,
195+
bufs: &mut [IoSliceMut<'_>],
196+
) -> Poll<io::Result<usize>> {
197+
self.project()
198+
.writer
199+
.get_pin_mut()
200+
.poll_read_vectored(cx, bufs)
201+
}
202+
}

src/futures/write/macros/decoder.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,24 @@ macro_rules! decoder {
7979
}
8080
}
8181

82+
impl<$inner: futures_io::AsyncWrite + futures_io::AsyncRead> futures_io::AsyncRead for $name<$inner> {
83+
fn poll_read(
84+
self: std::pin::Pin<&mut Self>,
85+
cx: &mut std::task::Context<'_>,
86+
buf: &mut [u8]
87+
) -> std::task::Poll<std::io::Result<usize>> {
88+
self.get_pin_mut().poll_read(cx, buf)
89+
}
90+
91+
fn poll_read_vectored(
92+
self: std::pin::Pin<&mut Self>,
93+
cx: &mut std::task::Context<'_>,
94+
bufs: &mut [futures_io::IoSliceMut<'_>]
95+
) -> std::task::Poll<std::io::Result<usize>> {
96+
self.get_pin_mut().poll_read_vectored(cx, bufs)
97+
}
98+
}
99+
82100
const _: () = {
83101
fn _assert() {
84102
use crate::util::{_assert_send, _assert_sync};

src/futures/write/macros/encoder.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,24 @@ macro_rules! encoder {
7676
}
7777
}
7878

79+
impl<$inner: futures_io::AsyncWrite + futures_io::AsyncRead> futures_io::AsyncRead for $name<$inner> {
80+
fn poll_read(
81+
self: std::pin::Pin<&mut Self>,
82+
cx: &mut std::task::Context<'_>,
83+
buf: &mut [u8]
84+
) -> std::task::Poll<std::io::Result<usize>> {
85+
self.get_pin_mut().poll_read(cx, buf)
86+
}
87+
88+
fn poll_read_vectored(
89+
self: std::pin::Pin<&mut Self>,
90+
cx: &mut std::task::Context<'_>,
91+
bufs: &mut [futures_io::IoSliceMut<'_>]
92+
) -> std::task::Poll<std::io::Result<usize>> {
93+
self.get_pin_mut().poll_read_vectored(cx, bufs)
94+
}
95+
}
96+
7997
const _: () = {
8098
fn _assert() {
8199
use crate::util::{_assert_send, _assert_sync};

src/tokio/bufread/generic/decoder.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ use core::{
22
pin::Pin,
33
task::{Context, Poll},
44
};
5-
use std::io::Result;
5+
use std::io::{IoSlice, Result};
66

77
use crate::{codec::Decode, util::PartialBuffer};
88
use futures_core::ready;
99
use pin_project_lite::pin_project;
10-
use tokio::io::{AsyncBufRead, AsyncRead, ReadBuf};
10+
use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, ReadBuf};
1111

1212
#[derive(Debug)]
1313
enum State {
@@ -162,3 +162,33 @@ impl<R: AsyncBufRead, D: Decode> AsyncRead for Decoder<R, D> {
162162
}
163163
}
164164
}
165+
166+
impl<R: AsyncWrite, D: Decode> AsyncWrite for Decoder<R, D> {
167+
fn poll_write(
168+
mut self: Pin<&mut Self>,
169+
cx: &mut Context<'_>,
170+
buf: &[u8],
171+
) -> Poll<Result<usize>> {
172+
self.project().reader.poll_write(cx, buf)
173+
}
174+
175+
fn poll_write_vectored(
176+
mut self: Pin<&mut Self>,
177+
cx: &mut Context<'_>,
178+
mut bufs: &[IoSlice<'_>],
179+
) -> Poll<Result<usize>> {
180+
self.project().reader.poll_write_vectored(cx, bufs)
181+
}
182+
183+
fn is_write_vectored(&self) -> bool {
184+
self.reader.is_write_vectored()
185+
}
186+
187+
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
188+
self.project().reader.poll_flush(cx)
189+
}
190+
191+
fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
192+
self.project().reader.poll_shutdown(cx)
193+
}
194+
}

src/tokio/bufread/generic/encoder.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ use core::{
22
pin::Pin,
33
task::{Context, Poll},
44
};
5-
use std::io::Result;
5+
use std::io::{IoSlice, Result};
66

77
use crate::{codec::Encode, util::PartialBuffer};
88
use futures_core::ready;
99
use pin_project_lite::pin_project;
10-
use tokio::io::{AsyncBufRead, AsyncRead, ReadBuf};
10+
use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, ReadBuf};
1111

1212
#[derive(Debug)]
1313
enum State {
@@ -119,3 +119,33 @@ impl<R: AsyncBufRead, E: Encode> AsyncRead for Encoder<R, E> {
119119
}
120120
}
121121
}
122+
123+
impl<R: AsyncWrite, E: Encode> AsyncWrite for Encoder<R, E> {
124+
fn poll_write(
125+
mut self: Pin<&mut Self>,
126+
cx: &mut Context<'_>,
127+
buf: &[u8],
128+
) -> Poll<Result<usize>> {
129+
self.project().reader.poll_write(cx, buf)
130+
}
131+
132+
fn poll_write_vectored(
133+
mut self: Pin<&mut Self>,
134+
cx: &mut Context<'_>,
135+
mut bufs: &[IoSlice<'_>],
136+
) -> Poll<Result<usize>> {
137+
self.project().reader.poll_write_vectored(cx, bufs)
138+
}
139+
140+
fn is_write_vectored(&self) -> bool {
141+
self.reader.is_write_vectored()
142+
}
143+
144+
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
145+
self.project().reader.poll_flush(cx)
146+
}
147+
148+
fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
149+
self.project().reader.poll_shutdown(cx)
150+
}
151+
}

0 commit comments

Comments
 (0)