4 个版本
0.1.3 | 2021 年 4 月 19 日 |
---|---|
0.1.2 | 2021 年 1 月 25 日 |
0.1.1 | 2021 年 1 月 25 日 |
0.1.0 | 2021 年 1 月 25 日 |
#7 在 #vec-deque
每月 44 次下载
24KB
187 行
扩展切片环形缓冲区
一种针对数据切片操作进行优化的自扩展环形缓冲区。此功能与 VecDeque
类似,但提供了方便的方法来高效地处理数据切片。这在处理输入和输出缓冲区大小不同的数据流时特别有用。
使用切片的复制/读取操作通过 memcpy 实现。此算法试图尽可能少地使用 memcpy 和分配,并且只有在缓冲区容量增加时才可能重新排列数据。
此缓冲区不包含任何生产者/消费者逻辑,但可以用作构建具有此类逻辑的环形缓冲区的构建块。
安装
将 expanding_slice_rb
添加到您的 Cargo.toml
中的依赖项
expanding_slice_rb = 0.1
示例
use expanding_slice_rb::ExpSliceRB;
// Create a ring buffer with type u32. There is no data in the buffer to start.
//
// If possible, it is a good idea to set `capacity` to the largest you expect the
// buffer to get to avoid future memory allocations.
let mut buf = ExpSliceRB::<u32>::with_capacity(3);
let data = [0u32, 1, 2];
// Memcpy data from a slice into the ring buffer. The buffer will automatically
// expand to fill new data.
buf.write(&data);
assert_eq!(buf.len(), 3);
assert_eq!(buf.capacity(), 3);
buf.write(&data);
assert_eq!(buf.len(), 6);
assert_eq!(buf.capacity(), 6);
// Memcpy the next chunk of data into the read slice. If the length of existing
// data in the buffer is less than the length of the slice, then only that amount
// of data will be copied into the front of the slice.
//
// This is streaming, meaning the copied data will be cleared from the buffer for
// reuse, and the next call to `read_into()` will start copying from where the
// previous call left off. If you don't want this behavior, use the `peek_into()`
// method instead.
let mut read_slice = [5u32; 4];
let mut amount_written = buf.read_into(&mut read_slice);
assert_eq!(amount_written, 4);
assert_eq!(read_slice, [0u32, 1, 2, 0]);
buf.write(&data);
let mut large_read_slice = [5u32; 8];
amount_written = buf.read_into(&mut large_read_slice);
assert_eq!(amount_written, 5);
assert_eq!(large_read_slice, [1u32, 2, 0, 1, 2, 5, 5, 5]);
依赖项
~150KB