Macro repr_offset::PUB_OFF

source ·
macro_rules! PUB_OFF {
    (
        $(:: $(@$leading:tt@)? )? $first:ident $(:: $trailing:ident)* ;
        $($fields:tt).+
    ) => { ... };
    ($type:ty; $($fields:tt).+ ) => { ... };
}
Expand description

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);
}