1 //! This module defines a macro that lets you go from a raw pointer to a struct
2 //! to a raw pointer to a field of the struct.
3 
4 macro_rules! generate_addr_of_methods {
5     (
6     impl<$($gen:ident)*> $struct_name:ty {$(
7         $(#[$attrs:meta])*
8         $vis:vis unsafe fn $fn_name:ident(self: NonNull<Self>) -> NonNull<$field_type:ty> {
9             &self$(.$field_name:tt)+
10         }
11     )*}
12     ) => {
13         impl<$($gen)*> $struct_name {$(
14             $(#[$attrs])*
15             $vis unsafe fn $fn_name(me: ::core::ptr::NonNull<Self>) -> ::core::ptr::NonNull<$field_type> {
16                 let me = me.as_ptr();
17                 let field = ::std::ptr::addr_of_mut!((*me) $(.$field_name)+ );
18                 ::core::ptr::NonNull::new_unchecked(field)
19             }
20         )*}
21     };
22 }
23