#deque #no-std #push-back

no-std bare_metal_deque

BareMetalDeque is a deque implementation intended for no_std use

1 unstable release

Uses new Rust 2024

0.1.0 Mar 28, 2025

#513 in Embedded development

Download history 123/week @ 2025-03-26

123 downloads per month

MIT/Apache

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 and Clone traits.
  • Expects its object type to implement the Default, Copy, and Clone 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);
}

No runtime deps