[−][src]Macro repr_offset::PUB_OFF
Gets the FieldOffset
for the passed in type and (possibly nested) public field.
This is the same as the OFF
macro,
except that this can't access private fields,
and it allows accessing fields from type parameters in generic functions.
Examples
Named Type
use repr_offset::{ for_examples::ReprC, PUB_OFF, FieldOffset, ROExtAcc, }; let this = ReprC {a: 3u8, b: 5u8, c: 8u8, d: 13u8}; // Passing the type as a path assert_eq!(PUB_OFF!(ReprC; a).get(&this), &this.a); // Passing the type as a type assert_eq!(PUB_OFF!(ReprC<_, _, _, _>; b).get(&this), &this.b); // Passing the type as a path assert_eq!(this.f_get(PUB_OFF!(ReprC; c)), &this.c); // Passing the type as a type assert_eq!(this.f_get(PUB_OFF!(ReprC<_, _, _, _>; d)), &this.d);
Accessing fields from type parameters
use repr_offset::{ for_examples::ReprC, tstr::TS, PUB_OFF, FieldOffset, GetPubFieldOffset, ROExtOps, }; let this = ReprC {a: 3u8, b: 5u8, c: 8u8, d: 13u8}; assertions(this); fn assertions<T, A>(this: T) where T: GetPubFieldOffset<TS!(a), Type = u8, Alignment = A>, T: GetPubFieldOffset<TS!(b), Type = u8, Alignment = A>, T: GetPubFieldOffset<TS!(c), Type = u8, Alignment = A>, T: GetPubFieldOffset<TS!(d), Type = u8, Alignment = A>, T: ROExtOps<A>, { assert_eq!(this.f_get_copy(PUB_OFF!(T; a)), 3); assert_eq!(this.f_get_copy(PUB_OFF!(T; b)), 5); assert_eq!(this.f_get_copy(PUB_OFF!(T; c)), 8); assert_eq!(this.f_get_copy(PUB_OFF!(T; d)), 13); }