Crates.io | bufferring |
lib.rs | bufferring |
version | 0.0.2 |
source | src |
created_at | 2023-04-03 12:41:48.88196 |
updated_at | 2023-04-06 20:42:09.087555 |
description | Ring buffers for Rust |
homepage | |
repository | https://git.sr.ht/~tdmm/bufferring |
max_upload_size | |
id | 829061 |
size | 59,287 |
A ring buffer is a fixed-size queue of items, where new items replace older ones when a fixed limit (the buffer's capacity) is hit. This crate provides a safe interface for ring buffers, along with some implementations of this interface.
WARNING: This crate is not ready for use. It contains a significant amount
of unsafe
code, and the majority of it is currently untested.
The RingBuffer
trait is the core of this crate; it represents a type that can
be used like a ring buffer. An implementor of this trait, MaskingBuffer
,
provides ring buffers with power-of-two sizes. MaskingBuffer
relies upon an
implementor of Storage
to actually hold the buffer data; currently, there are
two options (ArrayStorage
for compile-time sizes, and HeapStorage
for
dynamic allocation).
use core::num::NonZeroUsize;
use bufferring::{
RingBuffer, MaskingBuffer,
storage::{Storage, HeapStorage},
};
// Create a masking-based ring buffer using heap-allocated storage.
let capacity = NonZeroUsize::new(8).unwrap();
let storage = HeapStorage::with_capacity(capacity);
let mut buffer = MaskingBuffer::new(storage).unwrap();
// Push some elements into the buffer.
for item in 0 .. 14 {
// Drop removed items immediately.
let _ = buffer.enqueue(item);
}
// See what elements are in the buffer.
println!("{:?}", buffer);
assert!(buffer.is_full());
assert!(buffer.iter().copied().eq(6 .. 14));
// Remove those elements from the buffer.
for item in 6 .. 14 {
assert_eq!(buffer.dequeue(), Some(item));
}
assert!(buffer.is_empty());
alloc
(enabled by default): use the alloc
crate for dynamic allocation.
This enables the HeapStorage
type, so that ring buffers can store their data
on the heap.
proptest
(disabled by default): expose generators (Strategy
functions) for
ring buffers and ring buffer inputs, using the proptest
crate. This is used
for property-based testing (and must be enabled to run bufferring
tests).
To run tests:
cargo test --all-features
This crate tests its code using property-based testing, à la proptest
. When
the proptest
feature is enabled (required for testing), functions are exposed
for randomly generating ring buffers (and ring buffer inputs), so that crates
depending upon bufferring
can easily perform property-based testing as well.
With all features disabled, bufferring
does not have any dependencies beyond
core
; it can be used in no_std
environments.
With the alloc
feature (enabled by default), the alloc
crate (which is a
subset of std
) is used.
With the proptest
feature (disabled by default), the proptest
crate and a
utility bit-vec
crate (already depended upon by proptest
) are used.
Copyright (c) 2023 The Depressed Milkman
bufferring
is under the MIT license. See the LICENSE
file for a full text.
This crate is heavily inspired by ringbuffer
; attempts were made to port
some of the changes over, but the core RingBuffer
traits these crates expose
are incompatibly different, and this crate introduces a new Storage
interface
that simplifies the primary ring-buffer code.