Macro memoffset::span_of[][src]

macro_rules! span_of {
    (@ helper $root : ident, [] ..=) => { ... };
    (@ helper $root : ident, [] ..) => { ... };
    (@ helper $root : ident, $parent : path, [] ..) => { ... };
    (@ helper $root : ident, $parent : path, [] ..= $end : tt) => { ... };
    (@ helper $root : ident, $parent : path, [] .. $end : tt) => { ... };
    (@ helper $root : ident, $parent : path, # $begin : tt [] ..= $end : tt) => { ... };
    (@ helper $root : ident, $parent : path, # $begin : tt [] .. $end : tt) => { ... };
    (@ helper $root : ident, $parent : path, # $begin : tt [] ..) => { ... };
    (@ helper $root : ident, $parent : path, # $begin : tt [] ..=) => { ... };
    (@ helper $root : ident, $parent : path, # $field : tt []) => { ... };
    (@ helper $root : ident, $parent : path, $(# $begin : tt) + [] $tt : tt
 $($rest : tt) *) => { ... };
    (@ helper $root : ident, $parent : path, [] $tt : tt $($rest : tt) *) => { ... };
    ($sty : path, $($exp : tt) +) => { ... };
}
Expand description

Produces a range instance representing the sub-slice containing the specified member.

This macro provides 2 forms of differing functionalities.

The first form is identical to the appearance of the offset_of! macro.

span_of!(Struct, member)

The second form of span_of! returns a sub-slice which starts at one field, and ends at another. The general pattern of this form is:

// Exclusive
span_of!(Struct, member_a .. member_b)
// Inclusive
span_of!(Struct, member_a ..= member_b)

// Open-ended ranges
span_of!(Struct, .. end)
span_of!(Struct, start ..)

Note: This macro uses recursion in order to resolve the range expressions, so there is a limit to the complexity of the expression. In order to raise the limit, the compiler’s recursion limit should be lifted.

Examples

use memoffset::span_of;

#[repr(C)]
struct Florp {
    a: u32
}

#[repr(C)]
struct Blarg {
    x: [u32; 2],
    y: [u8; 56],
    z: Florp,
    egg: [[u8; 4]; 4]
}

fn main() {
    assert_eq!(0..84,  span_of!(Blarg, ..));
    assert_eq!(0..8,   span_of!(Blarg, .. y));
    assert_eq!(0..64,  span_of!(Blarg, ..= y));
    assert_eq!(0..8,   span_of!(Blarg, x));
    assert_eq!(8..84,  span_of!(Blarg, y ..));
    assert_eq!(0..8,   span_of!(Blarg, x .. y));
    assert_eq!(0..64,  span_of!(Blarg, x ..= y));
}