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}