2个版本
0.0.2 | 2023年4月6日 |
---|---|
0.0.1 | 2023年4月3日 |
1859 在 数据结构
59KB
956 行
Bufferring:Rust的环形缓冲区
环形缓冲区是一种固定大小的项目队列,当达到固定限制(缓冲区容量)时,新项目将替换较旧的项目。此crate提供了一个安全的环形缓冲区接口,以及一些该接口的实现。
警告:此crate尚未准备好使用。它包含大量不安全
代码,其中大部分目前尚未经过测试。
用法
RingBuffer
trait是此crate的核心;它表示可以像环形缓冲区一样使用的类型。此trait的实现者MaskingBuffer
提供了具有2的幂次方大小的环形缓冲区。MaskingBuffer
依赖于Storage
的实现来实际持有缓冲区数据;目前有两个选项(用于编译时大小的ArrayStorage
和用于动态分配的HeapStorage
)。
use core::num::NonZeroUsize;
use bufferring::{
RingBuffer, MaskingBuffer,
storage::{Storage, HeapStorage},
};
// Create a masking-based ring buffer using heap-allocated storage.
let capacity = NonZeroUsize::new(8).unwrap();
let storage = HeapStorage::with_capacity(capacity);
let mut buffer = MaskingBuffer::new(storage).unwrap();
// Push some elements into the buffer.
for item in 0 .. 14 {
// Drop removed items immediately.
let _ = buffer.enqueue(item);
}
// See what elements are in the buffer.
println!("{:?}", buffer);
assert!(buffer.is_full());
assert!(buffer.iter().copied().eq(6 .. 14));
// Remove those elements from the buffer.
for item in 6 .. 14 {
assert_eq!(buffer.dequeue(), Some(item));
}
assert!(buffer.is_empty());
功能
-
alloc
(默认启用):使用alloc
crate进行动态分配。这启用了HeapStorage
类型,以便环形缓冲区可以在堆上存储其数据。 -
proptest
(默认禁用):使用proptest
crate公开环形缓冲区和环形缓冲区输入的生成器(Strategy
函数)。这用于属性测试(必须启用才能运行bufferring
测试)。
测试
运行测试
cargo test --all-features
此crate使用属性测试来测试其代码,类似于proptest
。当proptest
功能启用(测试所必需)时,会公开用于随机生成环形缓冲区(和环形缓冲区输入)的函数,以便依赖于bufferring
的crate可以轻松进行属性测试。
依赖关系
禁用所有功能后,bufferring
没有除core
以外的任何依赖项;它可以在no_std
环境中使用。
-
启用
alloc
功能(默认启用)时,使用alloc
crate(它是std
的一个子集)。 -
使用
proptest
功能(默认禁用),使用proptest
crate 和一个工具bit-vec
crate(已被proptest
依赖)。
许可证
Copyright (c) 2023 The Depressed Milkman
bufferring
采用 MIT 许可证。请参阅 LICENSE
文件以获取完整内容。
来源
此 crate 受 ringbuffer
强烈启发;尝试将一些更改移植过来,但这些 crate 提供的核心 RingBuffer
特性不兼容,并且此 crate 引入了一个新的 Storage
接口,简化了主要环形缓冲区代码。
依赖关系
~0–1MB
~18K SLoC