rust / expert
Snippet
Überladen von Indizierungsoperatoren für zweidimensionale Array-Strides
Die Verwendung der Traits Index und IndexMut ermöglicht es benutzerdefinierten Strukturen, die Arrays darstellen, die standardmäßige eckige Klammernotation zu unterstützen. Durch die Abbildung einer 2D-Koordinate (row, col) auf einen flachen 1D-Puffer unter Verwendung einer zur Kompilierzeit geprüften Stride-Dimension (WIDTH) erreichen wir Sicherheit und saubere Ergonomie.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use std::ops::{Index, IndexMut};pub struct FlattenedGrid<T, const WIDTH: usize> {pub buffer: Vec<T>,}impl<T, const WIDTH: usize> Index<(usize, usize)> for FlattenedGrid<T, WIDTH> {type Output = T;fn index(&self, index: (usize, usize)) -> &Self::Output {let (row, col) = index;&self.buffer[row * WIDTH + col]}}impl<T, const WIDTH: usize> IndexMut<(usize, usize)> for FlattenedGrid<T, WIDTH> {fn index_mut(&mut self, index: (usize, usize)) -> &mut Self::Output {let (row, col) = index;&mut self.buffer[row * WIDTH + col]}}
Erklärung
1
impl<T, const WIDTH: usize> Index<(usize, usize)> for FlattenedGrid<T, WIDTH> {
Ermöglicht die Indizierung mit Koordinaten des Typs (usize, usize) durch Überladen des Index-Operators.
2
&self.buffer[row * WIDTH + col]
Übersetzt 2D-Indizierung in 1D-Indizierung basierend auf der Breite zur Kompilierzeit und gibt eine Referenz auf das Element zurück.
3
impl<T, const WIDTH: usize> IndexMut<(usize, usize)> for FlattenedGrid<T, WIDTH> {
Implementiert die veränderliche Variante der Index-Operatorüberladung, was die direkte Zuweisung zu gemappten Elementen ermöglicht.