[][src]Crate memoffset

A crate used for calculating offsets of struct members and their spans.

Some of the funcationality of the crate makes no sense when used along with structs that are not #[repr(C, packed)], but it is up to the user to make sure that they are.

This functionality should work for consts but presently doesn't work on const fn. Storing a value in a const and then returning it from a const fn should workaround most cases.

Examples

#[macro_use]
extern crate memoffset;

#[repr(C, packed)]
struct HelpMeIAmTrappedInAStructFactory {
    help_me_before_they_: [u8; 15],
    a: u32
}

fn main() {
    assert_eq!(offset_of!(HelpMeIAmTrappedInAStructFactory, a), 15);
    assert_eq!(span_of!(HelpMeIAmTrappedInAStructFactory, a), 15..19);
    assert_eq!(span_of!(HelpMeIAmTrappedInAStructFactory, help_me_before_they_[2] .. a), 2..15);
}

This functionality can be useful, for example, for checksum calculations:

This example is not tested
#[repr(C, packed)]
struct Message {
    header: MessageHeader,
    fragment_index: u32,
    fragment_count: u32,
    payload: [u8; 1024],
    checksum: u16
}

let checksum_range = &raw[span_of!(Message, header..checksum)];
let checksum = crc16(checksum_range);

Macros

offset_of

Calculates the offset of the specified field from the start of the struct. This macro supports arbitrary amount of subscripts and recursive member-accesses.

span_of

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