#async-std #unpin #pin #async

pin-cursor

为 async-std 提供的一个简单的 !Unpin I/O 后端

1 个稳定版本

1.0.0 2020 年 4 月 11 日

#81 in #pin

MIT OR Apache-2.0 OR MPL-2.0

9KB
103

为 async-std 提供的一个简单的 !Unpin I/O 后端

这是一个围绕 async-std 的 Cursor 的包装器,但这个是 !Unpin。我想用它来测试那些应该能够支持 Unpin!Unpin 后端的异步 I/O 代码。

请参阅 crate 级别文档以获取使用信息和示例。


lib.rs:

为 async-std 设计的一个简单的 !Unpin I/O 后端,用于测试

此包提供 PinCursor 结构体,该结构体包装了 async_std::io::Cursor,但明确不是 Unpin。这是一个构建块,可以帮助编写测试,确保您的异步 I/O 代码在从或向某些 肯定!Unpin 的对象读取或写入时表现正确。

  • 它可以由任何可以放入 async_std::io::CursorUnpin 数据缓冲区支持。通常使用 Vec<u8>&mut [u8](例如从数组中)。
  • 它实现了 async_std::io::{Read, Write, Seek},因此您可以在自己的 futures 中轮询这些特质的这些方法。
  • 同时,它通过几个高级方法提供了一些方法,通过这些方法您可以在简单的 async {} 块中操作 PinCursor。

示例

use pin_cursor::PinCursor;
use async_std::io::{prelude::*, Cursor};
use std::io::SeekFrom;
use std::pin::Pin;

// Construct a async_std::io::Cursor however you like...
let mut data: Vec<u8> = Vec::new();
let cursor = Cursor::new(&mut data);
// ... then wrap it in PinCursor and a pinned pointer, thus losing the Unpin privileges.
let mut cursor: Pin<Box<PinCursor<_>>> = Box::pin(PinCursor::wrap(cursor));
// Note that we have to make an owning pointer first -
// making a Pin<&mut PinCursor<_>> directly is impossible!
// (There is a more complex way to allocate on stack - see the features section.)

// Methods of PinCursor mostly return futures and are designed for use in async contexts.
async {
    // You can write!
    assert_eq!(cursor.as_mut().write(&[1u8, 2u8, 3u8]).await.unwrap(), 3);

    // You can seek!
    assert_eq!(cursor.position(), 3);
    assert_eq!(cursor.as_mut().seek(SeekFrom::Start(1)).await.unwrap(), 1);
    assert_eq!(cursor.position(), 1);

    // You can read!
    let mut buf = [0u8; 1];
    assert_eq!(cursor.as_mut().read(buf.as_mut()).await.unwrap(), 1);
    assert_eq!(buf[0], 2);

    // There's also this way of seeking that doesn't involve futures.
    cursor.as_mut().set_position(0);
    assert_eq!(cursor.as_mut().read(buf.as_mut()).await.unwrap(), 1);
    assert_eq!(buf[0], 1);
}

功能

可选功能 stackpin 允许与 stackpin 集成,这是一个提供在栈上分配 !Unpin 结构的方法的 crate。

# use pin_cursor::PinCursor;
# use async_std::io::Cursor;
# use std::pin::Pin;
use stackpin::stack_let;

let mut data: Vec<u8> = vec![1, 2];
stack_let!(mut cursor : PinCursor<_> = Cursor::new(&mut data));
let cursor_ptr: Pin<&mut PinCursor<_>> = Pin::as_mut(&mut cursor);

现在您有一个正确固定在栈上的 PinCursor,而不是在盒子里。

依赖关系

~5–17MB
~190K SLoC