#ring-buffer #string #fixed-size #queue

无 std st_ring_buffer

使用环形缓冲区实现的固定大小字符串

3 个版本 (1 个稳定版)

1.0.0 2022 年 8 月 21 日
0.2.0 2022 年 8 月 15 日
0.1.0 2022 年 8 月 13 日

#2031 in 数据结构

MIT/Apache

68KB
1K SLoC

StRing Buffer

StRing Buffer 是一个固定大小的 UTF-8 字符串。它使用环形缓冲区,当缓冲区满时覆盖前面。


GitHub Workflow Status docs.rs Crates.io Crates.io

用法

您可以使用常数大小 StRingBuffer::<SIZE>::new() 在堆栈上创建一个缓冲区,或者使用可变大小 HeapStRingBuffer::new(SIZE) 在堆上创建一个缓冲区。

这两种类型的缓冲区都实现了 StringBuffer 特性。该特性具有 .push_str().push_char() 方法来向缓冲区添加数据。

读取数据稍微复杂一些。方法 .as_slices() 返回两个 &str。如果缓冲区达到其分配大小的末尾并回环,则第一个 &str 将包含从缓冲区开始到结束的字符串数据,第二个字符串将包含剩余的数据。

如果要在单个 &str 中获取所有数据,则首先在缓冲区上调用 .align()。这将确保所有数据都从 .as_slices() 返回的第一个 &str 中返回。

示例

use st_ring_buffer::{HeapStRingBuffer, StRingBuffer, StringBuffer};

fn main() {
  // On the heap
  let mut heap = HeapStRingBuffer::new(5);
  heap.push_str("ABCDE");
  //as_slices() returns (&str, &str). If the buffer does not loop around the capacity then the second &str is empty.  
  assert_eq!(heap.as_slices().0, "ABCDE");
  //"FG" loops around to the front of the buffer, overwriting "AB"
  heap.push_str("FG");
  let (first, second) = heap.as_slices();
  assert_eq!(first, "CDE");
  assert_eq!(second, "FG");

  // On the stack
  let mut stack = StRingBuffer::<5>::new();
  stack.push_str("ABCDE");
  //'F' overwrites 'A', making the buffer loop around the capacity
  stack.push_char('F');
  //align the buffer so everything fits in one &str
  stack.align();
  assert_eq!(stack.as_slices().0, "BCDEF");
}

时间复杂度

将数据推入缓冲区总是常数时间。使用最多两次memcopys进行缓冲区对齐也是在常数时间内完成的;然而,它确实分配了一个临时缓冲区,其大小与as_slices()返回的最短&str相同。如果想要在不分配临时缓冲区的情况下进行对齐,StringBuffer特质还提供了align_no_alloc,但使用O(n)时间,其中'n'是缓冲区最短边的长度。

功能

包括对Serde的可选支持。

无Std

默认情况下,此库与nostd兼容。存在一个std功能,可以将std::error::Error添加到StringBufferError类型。

许可协议

根据您的选择,许可协议为

任选其一。

贡献

除非您明确声明,否则您提交给工作以供包含的任何贡献,根据Apache-2.0许可定义,均应双许可如上所述,没有任何额外的条款或条件。

依赖关系

~175KB