#ring-buffer #circular-buffer #buffer #ring #dsp #circular

bit_mask_ring_buf

具有低成本索引的环形缓冲区实现

28个版本

0.5.3 2023年3月24日
0.5.2 2020年8月25日
0.4.6 2020年8月24日
0.3.1 2020年8月21日
0.1.6 2020年8月6日

数据结构 中排名 830

MIT 许可证

180KB
2.5K SLoC

位掩码环形缓冲区

Test Documentation Crates.io License

用Rust编写的具有低成本索引的环形缓冲区实现。

注意,如果您的算法一次索引一个元素,并且缓冲区大小总是2的幂,则此crate非常有用。如果您的算法读取数据块作为切片,或者需要非2的幂的缓冲区大小,请查看我的crate slice_ring_buf

此crate没有消费者/生产者逻辑,旨在用作原始数据结构或其他数据结构的基础。

安装

在您的 Cargo.toml 中添加 bit_mask_ring_buf 作为依赖项

bit_mask_ring_buf = 0.5

示例

use bit_mask_ring_buf::{BMRingBuf, BMRingBufRef};

// Create a ring buffer with type u32. The data will be
// initialized with the default value (0 in this case).
// The actual length will be set to the next highest
// power of 2 if the given length is not already
// a power of 2.
let mut rb = BMRingBuf::<u32>::from_len(3);
assert_eq!(rb.len(), 4);

// Read/write to buffer by indexing with an `isize`.
rb[0] = 0;
rb[1] = 1;
rb[2] = 2;
rb[3] = 3;

// Cheaply wrap when reading/writing outside of bounds.
assert_eq!(rb[-1], 3);
assert_eq!(rb[10], 2);

// Memcpy into slices at arbitrary `isize` indexes
// and length.
let mut read_buffer = [0u32; 7];
rb.read_into(&mut read_buffer, 2);
assert_eq!(read_buffer, [2, 3, 0, 1, 2, 3, 0]);

// Memcpy data from a slice into the ring buffer at
// arbitrary `isize` indexes. Earlier data will not be
// copied if it will be overwritten by newer data,
// avoiding unecessary memcpy's. The correct placement
// of the newer data will still be preserved.
rb.write_latest(&[0, 2, 3, 4, 1], 0);
assert_eq!(rb[0], 1);
assert_eq!(rb[1], 2);
assert_eq!(rb[2], 3);
assert_eq!(rb[3], 4);

// Read/write by retrieving slices directly.
let (s1, s2) = rb.as_slices_len(1, 4);
assert_eq!(s1, &[2, 3, 4]);
assert_eq!(s2, &[1]);

// Aligned/stack data may also be used.
let mut stack_data = [0u32, 1, 2, 3];
let mut rb_ref = BMRingBufRef::new(&mut stack_data);
rb_ref[-4] = 5;
assert_eq!(rb_ref[0], 5);
assert_eq!(rb_ref[1], 1);
assert_eq!(rb_ref[2], 2);
assert_eq!(rb_ref[3], 3);

// Get linear interpolation on floating point buffers.
let mut rb = BMRingBuf::<f64>::from_len(4);
rb[0] = 0.0;
rb[1] = 2.0;
rb[2] = 4.0;
rb[3] = 6.0;
assert!((rb.lin_interp_f64(1.0) - 2.0).abs() <= f64::EPSILON);
assert!((rb.lin_interp_f64(1.25) - 2.5).abs() <= f64::EPSILON);
assert!((rb.lin_interp_f64(3.75) - 1.5).abs() <= f64::EPSILON);

无运行时依赖项