0 Tage Serie
rust / expert
Snippet

Implementierung einer zirkulären Warteschlange fester Größe mit Const Generics

Dieses Snippet implementiert einen Ringpuffer fester Größe unter Verwendung von Rusts Const Generics und Array-Typen. Durch das Einfordern des Default-Traits auf dem Array [Option<T>; N] kann der Puffer seinen Speicher sicher initialisieren, ohne dass T das Copy-Trait implementieren muss, und nutzt eine Index-Umlauf-Arithmetik.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pub struct ArrayBuffer<T, const N: usize> {
data: [Option<T>; N],
head: usize,
tail: usize,
}
impl<T, const N: usize> ArrayBuffer<T, N> {
pub fn new() -> Self
where
[Option<T>; N]: Default,
{
Self {
data: Default::default(),
head: 0,
tail: 0,
}
}
pub fn push(&mut self, item: T) -> Result<(), &'static str> {
let next_head = (self.head + 1) % N;
if next_head == self.tail {
return Err("Queue full");
}
self.data[self.head] = Some(item);
self.head = next_head;
Ok(())
}
}
Erklärung
1
pub struct ArrayBuffer<T, const N: usize>
Deklariert eine generische Struktur, die sowohl über einen Typ T als auch eine konstante Array-Größe N parametrisiert ist.
2
where [Option<T>; N]: Default
Erzwingt, dass die Array-Struktur selbst mit Standardwerten (welche None sind) initialisiert werden kann.
3
let next_head = (self.head + 1) % N;
Berechnet die nächste Schreibposition mittels Modulo-Arithmetik basierend auf der Array-Größe N.
4
self.data[self.head] = Some(item);
Fügt das Element in den Array-Slot ein und nutzt dabei die standardmäßige Array-Indizierung.