3个版本

0.1.2 2023年8月15日
0.1.1 2023年8月13日
0.1.0 2023年8月5日

#1443 in 数据结构

MIT 许可证

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有何区别?

正如其名所示,三分环缓冲区使用三个区域而不是两个。这允许在缓冲区的后端和/或前端读取和写入数据。

无运行时依赖项