#[macro_export]
macro_rules! field_size {
($t:ty, $f:ident) => {{
let uninit = std::mem::MaybeUninit::<$t>::uninit();
let base = uninit.as_ptr();
let field_ptr = unsafe { std::ptr::addr_of!((*base).$f) };
unsafe {
(field_ptr.add(1) as *const u8).offset_from(field_ptr as *const u8)
as usize
}
}};
}
#[cfg(test)]
mod tests {
use crate::raw::{
btrfs_dev_extent, btrfs_qgroup_info_item, btrfs_qgroup_limit_item,
btrfs_qgroup_status_item, btrfs_root_item, btrfs_stripe,
};
#[test]
fn field_size_matches_expected() {
assert_eq!(field_size!(btrfs_root_item, uuid), 16);
assert_eq!(field_size!(btrfs_root_item, parent_uuid), 16);
assert_eq!(field_size!(btrfs_root_item, received_uuid), 16);
assert_eq!(field_size!(btrfs_root_item, generation), 8);
assert_eq!(field_size!(btrfs_root_item, flags), 8);
assert_eq!(field_size!(btrfs_qgroup_info_item, rfer), 8);
assert_eq!(field_size!(btrfs_qgroup_limit_item, max_rfer), 8);
assert_eq!(field_size!(btrfs_qgroup_status_item, flags), 8);
assert_eq!(field_size!(btrfs_dev_extent, length), 8);
assert_eq!(field_size!(btrfs_stripe, dev_uuid), 16);
}
}