Expand description
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);
}