1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
#![recursion_limit="128"] use synstructure::decl_derive; use quote::quote; decl_derive!([ProofSize, attributes(unsafe_abomonate_ignore)] => derive_proofsize); fn derive_proofsize(mut s: synstructure::Structure) -> proc_macro2::TokenStream { let body = s.fold(0 as usize, |acc, bi| quote!{ #acc + ::rug_binserial::ProofSize::proof_size(#bi) // 0 as usize }); s.bound_impl(quote!(rug_binserial::ProofSize), quote!{ fn proof_size(&self) -> usize { match *self { #body } } }) } // fn derive_abomonation(mut s: synstructure::Structure) -> proc_macro2::TokenStream { // s.filter(|bi| { // !bi.ast().attrs.iter() // .map(|attr| attr.parse_meta()) // .filter_map(Result::ok) // .any(|attr| attr.path().is_ident("unsafe_abomonate_ignore")) // }); // let entomb = s.each(|bi| quote! { // ::abomonation::Abomonation::entomb(#bi, _write)?; // }); // let extent = s.each(|bi| quote! { // sum += ::abomonation::Abomonation::extent(#bi); // }); // s.bind_with(|_| synstructure::BindStyle::RefMut); // let exhume = s.each(|bi| quote! { // let temp = bytes; // bytes = ::abomonation::Abomonation::exhume(#bi, temp)?; // }); // s.bound_impl(quote!(abomonation::Abomonation), quote! { // #[inline] unsafe fn entomb<W: ::std::io::Write>(&self, _write: &mut W) -> ::std::io::Result<()> { // match *self { #entomb } // Ok(()) // } // #[allow(unused_mut)] // #[inline] fn extent(&self) -> usize { // let mut sum = 0; // match *self { #extent } // sum // } // #[allow(unused_mut)] // #[inline] unsafe fn exhume<'a,'b>( // &'a mut self, // mut bytes: &'b mut [u8] // ) -> Option<&'b mut [u8]> { // match *self { #exhume } // Some(bytes) // } // }) // }