3个版本
0.1.2 | 2023年8月15日 |
---|---|
0.1.1 | 2023年8月13日 |
0.1.0 | 2023年8月5日 |
#1443 in 数据结构
51KB
1K SLoC
triskell
三分环缓冲区类似于循环缓冲区,但数据插入缓冲区空间中的三个旋转区域。这允许读取返回连续的内存块,即使在循环缓冲区中通常包括回绕的区域也是如此。它特别适用于需要连续内存块的API,消除了在使用前将数据复制到临时缓冲区的需求。
它深受Simon Cooke的文章Bip-Buffer的启发。
示例
use triskell::TRBuffer;
// Creates a TRBuffer of u8 and allocates 8 elements
let mut buffer: TRBuffer<u8> = TRBuffer::with_capacity(8);
{
// Reserves 4 slots at the back for insert
let reserved = buffer.reserve_back(4).unwrap();
reserved[0] = 2;
reserved[1] = 12;
reserved[2] = 34;
reserved[3] = 7;
}
// Stores the values into an available region
buffer.commit(4);
{
// Gets the front data stored in the region as a contiguous block
let block = buffer.read_front().unwrap();
assert_eq!(block[0], 2);
assert_eq!(block[1], 12);
assert_eq!(block[2], 34);
assert_eq!(block[3], 7);
}
// Release the first two front elements of the block
buffer.free_front(2);
{
let block = buffer.read_front().unwrap();
assert_eq!(block[0], 34);
assert_eq!(block[1], 7);
}
容量和重新分配
如果预留空间超过了缓冲区容量,选择的分配策略将决定是否分配新空间或返回错误。
- AllocationStrategy::Exact:为插入指定数量的额外元素保留所需的最小容量。
- AllocationStrategy::AtLeast (默认):使用此策略时,容量保留以适应至少指定数量的额外元素。
- AllocationStrategy::NonGrowable:如果尝试预留超过缓冲区限制的容量,则返回错误。
use triskell::{TRBuffer, AllocationStrategy};
let mut buffer: TRBuffer<u8> = TRBuffer::new();
buffer.set_allocation_strategy(AllocationStrategy::Exact);
与Bip-Buffer有何区别?
正如其名所示,三分环缓冲区使用三个区域而不是两个。这允许在缓冲区的后端和/或前端读取和写入数据。