2个版本

0.0.2 2023年4月6日
0.0.1 2023年4月3日

1859数据结构

MIT 许可证

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