5 unstable releases
0.3.0 | Jul 9, 2021 |
---|---|
0.2.2 | Jul 6, 2021 |
0.2.1 | Jul 4, 2021 |
0.2.0 | Jul 4, 2021 |
0.1.0 | Jul 3, 2021 |
#1534 in Rust patterns
13KB
132 lines
multi_stack_queue
A crate for stack-allocated fixed-length multiqueues. A multiqueue is an array of a given number of queues, each able to be accessed independently.
Based on an original idea from Pollux3737.
Usage
The generic definition is the following :
MultiStackQueue<T, const N: usize, const M: usize>
With :
T
- type contained in the queuesN
- length of each queueM
- number of queues
Example usecases
- When writing a simple micro-kernel, the scheduler may need some sort of multiple Round-Robins. Having it allocated on the stack removes the need for a heap allocator, which can be useful when working on this kind of ressource-limited target.
Examples
use multi_stack_queue::MultiStackQueue;
#[derive(Debug, PartialEq, Eq)]
struct TestStruct {
a: usize,
b: bool,
}
let mut msq: MultiStackQueue<TestStruct, 16, 8> = MultiStackQueue::new();
let value = TestStruct { a: 42, b: false };
msq.push(7, value).unwrap();
assert_eq!(msq.pop(7).unwrap(), value);
Roadmap
[X] Using arrays of Option<T>
requires that T
implements the Copy
trait, which may not be the case. A different approach is to use default values instead of Option::None
to initialize the arrays. This way, T
must need not implement Copy
but Default
, which may be beneficial in some usecases. Another idea would be to make use of the MaybeUnInit
type.
[X] Add options in the generic definition of MultiStackQueue
to enable the user to specify the procedure in case of a push
on a full queue or a pop
on an empty queue. For instance, one could wish trying to push an element to a full queue would simply push it to the following queue (and same thing when trying to pop
an element). This would add a sort of "spill mechanism"