@@ -952,3 +952,61 @@ pub fn float(input: TokenStream) -> TokenStream {
952
952
953
953
import. wrap ( "Float" , name, impl_) . into ( )
954
954
}
955
+
956
+ /// Derives [`num_traits::Signed`][signed] for newtypes. The inner type must already implement
957
+ /// `Signed`.
958
+ ///
959
+ /// [signed]: https://docs.rs/num-traits/0.2/num_traits/sign/trait.Signed.html
960
+ #[ proc_macro_derive( Signed , attributes( num_traits) ) ]
961
+ pub fn signed ( input : TokenStream ) -> TokenStream {
962
+ let ast = parse ! ( input as syn:: DeriveInput ) ;
963
+ let name = & ast. ident ;
964
+ let inner_ty = newtype_inner ( & ast. data ) . expect ( NEWTYPE_ONLY ) ;
965
+
966
+ let import = NumTraits :: new ( & ast) ;
967
+
968
+ let impl_ = quote ! {
969
+ impl #import:: Signed for #name {
970
+ #[ inline]
971
+ fn abs( & self ) -> Self {
972
+ #name( <#inner_ty as #import:: Signed >:: abs( & self . 0 ) )
973
+ }
974
+ #[ inline]
975
+ fn abs_sub( & self , other: & Self ) -> Self {
976
+ #name( <#inner_ty as #import:: Signed >:: abs_sub( & self . 0 , & other. 0 ) )
977
+ }
978
+ #[ inline]
979
+ fn signum( & self ) -> Self {
980
+ #name( <#inner_ty as #import:: Signed >:: signum( & self . 0 ) )
981
+ }
982
+ #[ inline]
983
+ fn is_positive( & self ) -> bool {
984
+ <#inner_ty as #import:: Signed >:: is_positive( & self . 0 )
985
+ }
986
+ #[ inline]
987
+ fn is_negative( & self ) -> bool {
988
+ <#inner_ty as #import:: Signed >:: is_negative( & self . 0 )
989
+ }
990
+ }
991
+ } ;
992
+
993
+ import. wrap ( "Signed" , & name, impl_) . into ( )
994
+ }
995
+
996
+ /// Derives [`num_traits::Unsigned`][unsigned]. The inner type must already implement
997
+ /// `Unsigned`.
998
+ ///
999
+ /// [unsigned]: https://docs.rs/num/latest/num/traits/trait.Unsigned.html
1000
+ #[ proc_macro_derive( Unsigned , attributes( num_traits) ) ]
1001
+ pub fn unsigned ( input : TokenStream ) -> TokenStream {
1002
+ let ast = parse ! ( input as syn:: DeriveInput ) ;
1003
+ let name = & ast. ident ;
1004
+
1005
+ let import = NumTraits :: new ( & ast) ;
1006
+
1007
+ let impl_ = quote ! {
1008
+ impl #import:: Unsigned for #name { }
1009
+ } ;
1010
+
1011
+ import. wrap ( "Unsigned" , & name, impl_) . into ( )
1012
+ }
0 commit comments