1 个稳定版本
1.0.0 | 2020 年 4 月 11 日 |
---|
#81 in #pin
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::Cursor
的Unpin
数据缓冲区支持。通常使用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