@@ -515,3 +515,45 @@ pub fn num_cast(input: TokenStream) -> TokenStream {
515515 }
516516 } ) . into ( )
517517}
518+
519+ /// Derives [`num_traits::Zero`][zero] for newtypes. The inner type must already implement `Zero`.
520+ ///
521+ /// [zero]: https://docs.rs/num-traits/0.2/num_traits/identities/trait.Zero.html
522+ #[ proc_macro_derive( Zero ) ]
523+ pub fn zero ( input : TokenStream ) -> TokenStream {
524+ let ast: syn:: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
525+ let name = & ast. ident ;
526+ let inner_ty = newtype_inner ( & ast. data ) . expect ( NEWTYPE_ONLY ) ;
527+ dummy_const_trick ( "Zero" , & name, quote ! {
528+ extern crate num_traits as _num_traits;
529+ impl _num_traits:: Zero for #name {
530+ fn zero( ) -> Self {
531+ #name( <#inner_ty as _num_traits:: Zero >:: zero( ) )
532+ }
533+ fn is_zero( & self ) -> bool {
534+ <#inner_ty as _num_traits:: Zero >:: is_zero( & self . 0 )
535+ }
536+ }
537+ } ) . into ( )
538+ }
539+
540+ /// Derives [`num_traits::One`][one] for newtypes. The inner type must already implement `One`.
541+ ///
542+ /// [one]: https://docs.rs/num-traits/0.2/num_traits/identities/trait.One.html
543+ #[ proc_macro_derive( One ) ]
544+ pub fn one ( input : TokenStream ) -> TokenStream {
545+ let ast: syn:: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
546+ let name = & ast. ident ;
547+ let inner_ty = newtype_inner ( & ast. data ) . expect ( NEWTYPE_ONLY ) ;
548+ dummy_const_trick ( "One" , & name, quote ! {
549+ extern crate num_traits as _num_traits;
550+ impl _num_traits:: One for #name {
551+ fn one( ) -> Self {
552+ #name( <#inner_ty as _num_traits:: One >:: one( ) )
553+ }
554+ fn is_one( & self ) -> bool {
555+ <#inner_ty as _num_traits:: One >:: is_one( & self . 0 )
556+ }
557+ }
558+ } ) . into ( )
559+ }
0 commit comments