5 ms·
FWIW the hacked up workaround that bindgen uses is _beautiful_ https://github.com/servo/rust-bindgen/blob/master/tests/expectations/tests/union_fields.rs https
by Manishearth 9y ago
FWIW the hacked up workaround that bindgen uses is _beautiful_
https://github.com/servo/rust-bindgen/blob/master/tests/expectations/tests/union_fields.rs https://github.com/servo/rust-bindgen/blob/master/tests/expe...
Basically, if you have a union of A, B, C, you create a struct with three zero-sized fields using BindgenUnionField<A>, and then add a field after that containing enough bits to actually fill out the size. Because the BindgenUnionField is zero sized, a pointer to it is a pointer to the beginning of the struct, and it has an accessor that treats the pointer as the contained type.
This makes the API for field access `union.field.as_ref()` instead of `union.field`, but that's still pretty clean.
It's still a hack, and I'll be happy to see it go, but it's a really fun hack.
- kibwen 9y agoIf only English already had a word for "beautiful, yet reprehensible". :)
- zem 9y agosirenlike
- tomsthumb 9y agoYou know this word in another language?
- andrewflnr 9y agoThere must be one in German. :)
- euyyn 9y agoProbably just the concatenation, like beautifulyetreprehensible.
- fanf2 9y agoWell "awful" etymologically means "inspiring awe"...
- Retra 9y ago>Because the BindgenUnionField is zero sized, a pointer to it is a pointer to the beginning of the struct Is that a stable assumption?
- Manishearth 9y agoBecause it's repr(C) IIRC yes.