mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-25 00:00:18 +02:00
* Removes most pin-projection related unsafe code. * Removes manual Unpin implementations. As references always implement Unpin, there is no need to implement Unpin manually. * Adds tests to check that Unpin requirement does not change accidentally because changing Unpin requirements will be breaking changes.
46 lines
1.1 KiB
Rust
46 lines
1.1 KiB
Rust
use crate::AsyncWrite;
|
|
use std::future::Future;
|
|
use std::io;
|
|
use std::pin::Pin;
|
|
use std::task::{Context, Poll};
|
|
|
|
/// A future to write some of the buffer to an `AsyncWrite`.
|
|
#[derive(Debug)]
|
|
#[must_use = "futures do nothing unless you `.await` or poll them"]
|
|
pub struct Write<'a, W: ?Sized> {
|
|
writer: &'a mut W,
|
|
buf: &'a [u8],
|
|
}
|
|
|
|
/// Tries to write some bytes from the given `buf` to the writer in an
|
|
/// asynchronous manner, returning a future.
|
|
pub(crate) fn write<'a, W>(writer: &'a mut W, buf: &'a [u8]) -> Write<'a, W>
|
|
where
|
|
W: AsyncWrite + Unpin + ?Sized,
|
|
{
|
|
Write { writer, buf }
|
|
}
|
|
|
|
impl<W> Future for Write<'_, W>
|
|
where
|
|
W: AsyncWrite + Unpin + ?Sized,
|
|
{
|
|
type Output = io::Result<usize>;
|
|
|
|
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
|
|
let me = &mut *self;
|
|
Pin::new(&mut *me.writer).poll_write(cx, me.buf)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn assert_unpin() {
|
|
use std::marker::PhantomPinned;
|
|
crate::is_unpin::<Write<'_, PhantomPinned>>();
|
|
}
|
|
}
|