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