bit_mask_ring_buf

Crates.iobit_mask_ring_buf
lib.rsbit_mask_ring_buf
version
sourcesrc
created_at2020-08-05 19:44:11.27896
updated_at2024-12-26 18:32:41.221344
descriptionA ring buffer implementation with cheap indexing
homepage
repositoryhttps://github.com/BillyDM/bit_mask_ring_buf
max_upload_size
id273370
Cargo.toml error:TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include`
size0
Billy Messenger (BillyDM)

documentation

https://docs.rs/bit_mask_ring_buf

README

Bit-Masking Ring Buffer

Test Documentation Crates.io License

A ring buffer implementation with cheap indexing written in Rust.

Note, this crate is only beneficial if your algorithm indexes elements one at a time and has buffer sizes that are always a power of two. If your algorithm instead reads chunks of data as slices or requires buffer sizes that are not a power of two, then check out my crate slice_ring_buf.

This crate has no consumer/producer logic, and is meant to be used for DSP or as a base for other data structures.

This crate can also be used without the standard library (#![no_std]).

Example

use bit_mask_ring_buf::{BitMaskRB, BitMaskRbRefMut};

// Create a ring buffer with type u32. The data will be
// initialized with the given 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 = BitMaskRB::<u32>::new(3, 0);
assert_eq!(rb.len().get(), 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 = BitMaskRbRefMut::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);

// Linear interpolation is also provided (requires the
// `interpolation` feature which requires the standard
// library.)
let rb = BitMaskRB::<f32>::from_vec(vec![0.0, 2.0, 4.0, 6.0]);
assert!((rb.lin_interp(-1.75) - 4.5).abs() <= f32::EPSILON);
Commit count: 70

cargo fmt