3 个版本 (1 个稳定版)
1.0.0 | 2022 年 8 月 21 日 |
---|---|
0.2.0 | 2022 年 8 月 15 日 |
0.1.0 | 2022 年 8 月 13 日 |
#2031 in 数据结构
68KB
1K SLoC
StRing Buffer
StRing Buffer 是一个固定大小的 UTF-8 字符串。它使用环形缓冲区,当缓冲区满时覆盖前面。
用法
您可以使用常数大小 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 License,版本2.0(《LICENSE-APACHE》或http://www.apache.org/licenses/LICENSE-2.0》)
- MIT许可(《LICENSE-MIT》或http://opensource.org/licenses/MIT》)
任选其一。
贡献
除非您明确声明,否则您提交给工作以供包含的任何贡献,根据Apache-2.0许可定义,均应双许可如上所述,没有任何额外的条款或条件。
依赖关系
~175KB