to_mut_proc_macro/
lib.rs

1extern crate proc_macro;
2extern crate syn;
3#[macro_use]
4extern crate quote;
5
6use proc_macro::TokenStream;
7
8#[proc_macro_derive(ToMut)]
9pub fn to_mut(input: TokenStream) -> TokenStream {
10    let ast = syn::parse(input).unwrap();
11    impl_to_mut(&ast)
12}
13
14fn impl_to_mut(ast: &syn::DeriveInput) -> TokenStream {
15    let name = &ast.ident;
16    (quote! {
17        impl ToMut for #name {
18            fn to_mut(&self) -> &mut #name {
19                unsafe {
20                    let const_ptr = self as *const #name;
21                    let mut_ptr = const_ptr as *mut #name;
22                    &mut *mut_ptr
23                }
24            }
25        }
26    }).into()
27}