1 unstable release
Uses new Rust 2024
0.1.0 | Mar 28, 2025 |
---|
#513 in Embedded development
123 downloads per month
11KB
196 lines
bare_metal_deque
Deque for use with no-std
Rust
The BareMetalDeque
represents a fixed-size double-ended queue analogous to VecDeque. It is implemented internally as a ring buffer.
There are numerous other implementations of this concept available. None quite met my own needs. Here is the combination of features that distinguishes this particular implementation:
Key features:
- Runs in
no-std
Rust projects. - No other dependencies.
- No
unsafe
code. - Can be indexed (mutably and otherwise).
- Can be iterated.
- Implements the
Copy
andClone
traits. - Expects its object type to implement the
Default
,Copy
, andClone
traits.
lib.rs
:
The BareMetalDeque
represents a fixed-size double-ended queue analogous to VecDeque. It is implemented internally as a ring buffer.
If you try to add to a full deque, it will panic.
Basic deque operations (push/pop front/back):
use bare_metal_deque::BareMetalDeque;
let mut q = BareMetalDeque::<i64, 3>::new();
q.push_back(1);
assert_eq!(q.back().unwrap(), 1);
assert_eq!(q.front().unwrap(), 1);
q.push_back(2);
assert_eq!(q.back().unwrap(), 2);
assert_eq!(q.front().unwrap(), 1);
q.push_back(3);
assert_eq!(q.back().unwrap(), 3);
assert_eq!(q.front().unwrap(), 1);
assert!(q.is_full());
assert_eq!(q.pop_front().unwrap(), 1);
assert_eq!(q.back().unwrap(), 3);
assert_eq!(q.front().unwrap(), 2);
assert!(!q.is_full());
q.push_front(4);
assert_eq!(q.back().unwrap(), 3);
assert_eq!(q.front().unwrap(), 4);
assert!(q.is_full());
assert_eq!(q.pop_back().unwrap(), 3);
assert_eq!(q.back().unwrap(), 2);
assert_eq!(q.front().unwrap(), 4);
assert!(!q.is_full());
q.push_back(5);
assert_eq!(q.back().unwrap(), 5);
assert_eq!(q.front().unwrap(), 4);
assert!(q.is_full());
// Indexing
assert_eq!(q[0], 4);
assert_eq!(q[1], 2);
assert_eq!(q[2], 5);
// Mutable indexing
q[0] = 6;
assert_eq!(q.pop_front().unwrap(), 6);
assert_eq!(q.back().unwrap(), 5);
assert_eq!(q.front().unwrap(), 2);
assert!(!q.is_full());
Iteration example:
use bare_metal_deque::BareMetalDeque;
let mut q = BareMetalDeque::<usize, 5>::new();
for n in 1..=3 {
q.push_back(n);
}
for (i, v) in q.iter().enumerate() {
assert_eq!(i + 1, *v);
assert_eq!(q[i], *v);
}