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#[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 let $ty { $field: _, .. };
33
34 let uninit: MaybeUninit<$ty> = MaybeUninit::uninit();
36
37 let base_ptr: *const $ty = uninit.as_ptr();
40
41 let field_ptr: *const _ = ptr::addr_of!((*base_ptr).$field);
43
44 let base_addr = base_ptr.cast::<u8>();
46 let field_addr = field_ptr.cast::<u8>();
47
48 field_addr.offset_from(base_addr) as usize
50 };
51 OFFSET
52 }};
53}