stdx/
macros.rs

1#[macro_export]
2macro_rules! cfg_group {
3    ($($item:item)*) => {
4        $($item)*
5    }
6}
7
8#[macro_export]
9macro_rules! assert_not {
10    ($expr:expr) => {
11        assert!(!$expr);
12    };
13}
14
15/// Calculates the offset of the specified field from the start of the named struct.
16#[macro_export]
17macro_rules! offset_of {
18    ($ty: path, $field: tt) => {{
19        use ::core::mem::MaybeUninit;
20        use ::core::primitive::{u8, usize};
21        use ::core::ptr;
22
23        #[allow(
24            unused_unsafe,
25            clippy::as_conversions,
26            clippy::unneeded_field_pattern,
27            clippy::undocumented_unsafe_blocks
28        )]
29        const OFFSET: usize = unsafe {
30            // ensure the type is a named struct
31            // ensure the field exists and is accessible
32            let $ty { $field: _, .. };
33
34            // const since 1.36
35            let uninit: MaybeUninit<$ty> = MaybeUninit::uninit();
36
37            // const since 1.59
38            // UnsafeCell needs feature(const_refs_to_cell)
39            let base_ptr: *const $ty = uninit.as_ptr();
40
41            // stable since 1.51
42            let field_ptr: *const _ = ptr::addr_of!((*base_ptr).$field);
43
44            // const since 1.38
45            let base_addr = base_ptr.cast::<u8>();
46            let field_addr = field_ptr.cast::<u8>();
47
48            // const since 1.65
49            field_addr.offset_from(base_addr) as usize
50        };
51        OFFSET
52    }};
53}