Generics mit Zeigerverstecken über `mem :: transmute ()`
Ich versuche, Rust-Bindings für eine C-Auflistungsbibliothek (Judy Arrays [1]) zu schreiben, die nur Platz zum Speichern eines Zeigerbreitenwerts bietet. Mein Unternehmen verfügt über eine große Menge an vorhandenem Code, der diesen Speicherplatz verwendet, um Nichtzeigerwerte wie Ganzzahlen mit Zeigerbreite und kleine Strukturen direkt zu speichern. Ich möchte, dass meine Rust-Bindungen mithilfe von Generika einen typsicheren Zugriff auf solche Auflistungen ermöglichen, habe jedoch Probleme, die Zeigersemantik ordnungsgemäß zu verwenden.
Dasmem::transmute()
ie @ -Funktion scheint ein potenzielles Werkzeug für die Implementierung des gewünschten Verhaltens zu sein, aber der Versuch, sie für eine Instanz eines parametrisierten Typs zu verwenden, führt zu einem für mich verwirrenden Kompilierungsfehler.
Beispielcode:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute(val);
}
}
}
Ergebnisfehler:
src/lib.rs:95:22: 95:36 error: cannot transmute to or from a type that contains type parameters in its interior [E0139]
src/lib.rs:95 self.v = mem::transmute(val);
^~~~~~~~~~~~~~
Bedeutet dies, dass ein Typ, der nur aus einem Parameter besteht, "Typparameter in seinem Inneren enthält" und somittransmute()
funktioniert hier einfach nicht? Irgendwelche Vorschläge, wie man das richtig macht?
( Verwandte Frage, versucht dasselbe Ergebnis zu erzielen, aber nicht unbedingt übermem::transmute()
.)
[1] Mir ist das vorhandene @ bekannrust-judy
project, aber es unterstützt nicht das von mir gewünschte Pointer-Stashing und ich schreibe diese neuen Bindings sowieso hauptsächlich als Lernübung.