@@ -496,3 +496,45 @@ pub fn num_cast(input: TokenStream) -> TokenStream {
496
496
}
497
497
} ) . into ( )
498
498
}
499
+
500
+ /// Derives [`num_traits::Zero`][zero] for newtypes. The inner type must already implement `Zero`.
501
+ ///
502
+ /// [zero]: https://docs.rs/num-traits/0.2/num_traits/cast/trait.Zero.html
503
+ #[ proc_macro_derive( Zero ) ]
504
+ pub fn zero ( input : TokenStream ) -> TokenStream {
505
+ let ast: syn:: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
506
+ let name = & ast. ident ;
507
+ let inner_ty = newtype_inner ( & ast. data ) . expect ( NEWTYPE_ONLY ) ;
508
+ dummy_const_trick ( "Zero" , & name, quote ! {
509
+ extern crate num_traits as _num_traits;
510
+ impl _num_traits:: Zero for #name {
511
+ fn zero( ) -> Self {
512
+ #name( <#inner_ty as _num_traits:: Zero >:: zero( ) )
513
+ }
514
+ fn is_zero( & self ) -> bool {
515
+ <#inner_ty as _num_traits:: Zero >:: is_zero( & self . 0 )
516
+ }
517
+ }
518
+ } ) . into ( )
519
+ }
520
+
521
+ /// Derives [`num_traits::One`][one] for newtypes. The inner type must already implement `One`.
522
+ ///
523
+ /// [one]: https://docs.rs/num-traits/0.2/num_traits/cast/trait.One.html
524
+ #[ proc_macro_derive( One ) ]
525
+ pub fn one ( input : TokenStream ) -> TokenStream {
526
+ let ast: syn:: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
527
+ let name = & ast. ident ;
528
+ let inner_ty = newtype_inner ( & ast. data ) . expect ( NEWTYPE_ONLY ) ;
529
+ dummy_const_trick ( "One" , & name, quote ! {
530
+ extern crate num_traits as _num_traits;
531
+ impl _num_traits:: One for #name {
532
+ fn one( ) -> Self {
533
+ #name( <#inner_ty as _num_traits:: One >:: one( ) )
534
+ }
535
+ fn is_one( & self ) -> bool {
536
+ <#inner_ty as _num_traits:: One >:: is_one( & self . 0 )
537
+ }
538
+ }
539
+ } ) . into ( )
540
+ }
0 commit comments