#ring-buffer #slice #ring #vec-deque #circular #queue #memory-management

expanding_slice_rb

一种自扩展环形缓冲区,类似于 VecDeque,针对数据切片操作进行了优化

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 次下载

MIT 许可证

24KB
187

扩展切片环形缓冲区

Test Documentation Crates.io License

一种针对数据切片操作进行优化的自扩展环形缓冲区。此功能与 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