| 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 | |