Bladeren bron

refactor 'impl Int'

Jorge Aparicio 8 jaren geleden
bovenliggende
commit
c6e06f4157
1 gewijzigde bestanden met toevoegingen van 29 en 52 verwijderingen
  1. 29 52
      src/int/mod.rs

+ 29 - 52
src/int/mod.rs

@@ -38,67 +38,44 @@ pub trait Int {
     fn extract_sign(self) -> (bool, Self::UnsignedInt);
 }
 
-// TODO: Once i128/u128 support lands, we'll want to add impls for those as well
-impl Int for u32 {
-    type OtherSign = i32;
-    type UnsignedInt = u32;
-
-    fn bits() -> u32 {
-        32
-    }
-
-    fn extract_sign(self) -> (bool, u32) {
-        (false, self)
-    }
-}
-
-impl Int for i32 {
-    type OtherSign = u32;
-    type UnsignedInt = u32;
-
-    fn bits() -> u32 {
-        32
-    }
+macro_rules! int_impl {
+    ($ity:ty, $uty:ty, $bits:expr) => {
+        impl Int for $uty {
+            type OtherSign = $ity;
+            type UnsignedInt = $uty;
+
+            fn bits() -> u32 {
+                $bits
+            }
 
-    fn extract_sign(self) -> (bool, u32) {
-        if self < 0 {
-            (true, !(self as u32) + 1)
-        } else {
-            (false, self as u32)
+            fn extract_sign(self) -> (bool, $uty) {
+                (false, self)
+            }
         }
-    }
-}
-
-impl Int for u64 {
-    type OtherSign = i64;
-    type UnsignedInt = u64;
-
-    fn bits() -> u32 {
-        64
-    }
 
-    fn extract_sign(self) -> (bool, u64) {
-        (false, self)
-    }
-}
+        impl Int for $ity {
+            type OtherSign = $uty;
+            type UnsignedInt = $uty;
 
-impl Int for i64 {
-    type OtherSign = u64;
-    type UnsignedInt = u64;
-
-    fn bits() -> u32 {
-        64
-    }
+            fn bits() -> u32 {
+                $bits
+            }
 
-    fn extract_sign(self) -> (bool, u64) {
-        if self < 0 {
-            (true, !(self as u64) + 1)
-        } else {
-            (false, self as u64)
+            fn extract_sign(self) -> (bool, $uty) {
+                if self < 0 {
+                    (true, !(self as $uty) + 1)
+                } else {
+                    (false, self as $uty)
+                }
+            }
         }
     }
 }
 
+int_impl!(i32, u32, 32);
+int_impl!(i64, u64, 64);
+int_impl!(i128, u128, 128);
+
 /// Trait to convert an integer to/from smaller parts
 pub trait LargeInt {
     type LowHalf;