async-std BufStream实现

tokio有BufStream,async-std居然没有,来给它包一包

use async_std:: net::TcpStream;
use async_std::io::{BufWriter,BufReader};
use futures::{AsyncRead,AsyncWrite};
use futures::{
    io::{IoSliceMut},
    prelude::*,
};
use pin_project_lite::pin_project;
use std::{io, io::Error as IoError, pin::Pin, task::Context, task::Poll};

pin_project! {
    struct BufStream
    {
        #[pin]
        reader : BufReader<&'static TcpStream>,
        #[pin]
        writer: BufWriter<&'static TcpStream>,
        _socket: Pin<Box<TcpStream>>,
    }
}
impl BufStream{
    pub fn new(socket: TcpStream) -> Self {
        let pin = Box::pin(socket);
        unsafe {
            Self{
                reader : BufReader::new(std::mem::transmute(&*pin)),
                writer: BufWriter::new(std::mem::transmute(&*pin)),
                _socket: pin,
            }
        }
    }
}
impl AsyncRead for BufStream {
    fn poll_read(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8]) -> Poll<Result<usize, IoError>> {
        self.project().reader.poll_read(cx, buf)
    }

    fn poll_read_vectored(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        bufs: &mut [IoSliceMut<'_>],
    ) -> Poll<io::Result<usize>> {
        self.project().reader.poll_read_vectored(cx, bufs)
    }
}
impl AsyncWrite for BufStream {
    fn poll_write(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &[u8],
    ) -> Poll<io::Result<usize>> {
        self.project().writer.poll_write(cx, buf)
    }

    fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
        self.project().writer.poll_flush(cx)
    }

    fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
        self.project().writer.poll_close(cx)
    }
}

impl AsyncBufRead for BufStream {
    fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
        self.project().reader.poll_fill_buf(cx)
    }

    fn consume(self: Pin<&mut Self>, amt: usize) {
        self.project().reader.consume(amt)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值