From 8550be0ba2b68415a22a65ff72db4952630591d4 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 28 Aug 2021 17:01:59 +0200 Subject: [PATCH] Refactor SignedInteger conversions to be more comprehensive and less repetitive --- .../preserves/src/value/signed_integer.rs | 125 +++++++++--------- 1 file changed, 65 insertions(+), 60 deletions(-) diff --git a/implementations/rust/preserves/src/value/signed_integer.rs b/implementations/rust/preserves/src/value/signed_integer.rs index 8b5e45f..9c753e5 100644 --- a/implementations/rust/preserves/src/value/signed_integer.rs +++ b/implementations/rust/preserves/src/value/signed_integer.rs @@ -81,29 +81,44 @@ impl SignedInteger { } } -impl From for SignedInteger { - fn from(v: i32) -> Self { - SignedInteger(SignedIntegerRepr::I128(v.into())) +//-- + +macro_rules! map_integral_type_to_signed_integer { + ($iN:ident, $uN:ident) => { + impl From<$iN> for SignedInteger { + fn from(v: $iN) -> Self { + SignedInteger(SignedIntegerRepr::I128(v.into())) + } + } + + impl From<$uN> for SignedInteger { + fn from(v: $uN) -> Self { + SignedInteger(SignedIntegerRepr::I128(v.into())) + } + } + + impl TryFrom<&SignedInteger> for $iN { + type Error = (); + fn try_from(v: &SignedInteger) -> Result { + i128::try_from(v)?.try_into().map_err(|_| ()) + } + } + + impl TryFrom<&SignedInteger> for $uN { + type Error = (); + fn try_from(v: &SignedInteger) -> Result { + u128::try_from(v)?.try_into().map_err(|_| ()) + } + } } } -impl From for SignedInteger { - fn from(v: u32) -> Self { - SignedInteger(SignedIntegerRepr::I128(v.into())) - } -} +map_integral_type_to_signed_integer!(i8, u8); +map_integral_type_to_signed_integer!(i16, u16); +map_integral_type_to_signed_integer!(i32, u32); +map_integral_type_to_signed_integer!(i64, u64); -impl From for SignedInteger { - fn from(v: i64) -> Self { - SignedInteger(SignedIntegerRepr::I128(v.into())) - } -} - -impl From for SignedInteger { - fn from(v: u64) -> Self { - SignedInteger(SignedIntegerRepr::I128(v.into())) - } -} +//-- impl From for SignedInteger { fn from(v: i128) -> Self { @@ -121,24 +136,6 @@ impl From for SignedInteger { } } -impl From for SignedInteger { - fn from(v: BigInt) -> Self { - Self::from(Cow::Owned(v)) - } -} - -impl<'a> From> for SignedInteger { - fn from(v: Cow<'a, BigInt>) -> Self { - if let Some(w) = v.to_i128() { - SignedInteger(SignedIntegerRepr::I128(w)) - } else if let Some(w) = v.to_u128() { - SignedInteger(SignedIntegerRepr::U128(w)) - } else { - SignedInteger(SignedIntegerRepr::Big(Box::new(v.into_owned()))) - } - } -} - impl TryFrom<&SignedInteger> for i128 { type Error = (); fn try_from(v: &SignedInteger) -> Result { @@ -161,13 +158,11 @@ impl TryFrom<&SignedInteger> for u128 { } } -impl<'a> From<&'a SignedInteger> for Cow<'a, BigInt> { - fn from(v: &'a SignedInteger) -> Self { - match v.repr() { - SignedIntegerRepr::I128(i) => Cow::Owned(BigInt::from(*i)), - SignedIntegerRepr::U128(u) => Cow::Owned(BigInt::from(*u)), - SignedIntegerRepr::Big(n) => Cow::Borrowed(n), - } +//-- + +impl From for SignedInteger { + fn from(v: BigInt) -> Self { + Self::from(Cow::Owned(v)) } } @@ -181,31 +176,41 @@ impl<'a> From<&'a SignedInteger> for BigInt { } } -impl TryFrom<&SignedInteger> for i32 { - type Error = (); - fn try_from(v: &SignedInteger) -> Result { - i128::try_from(v)?.try_into().map_err(|_| ()) +//-- + +impl<'a> From> for SignedInteger { + fn from(v: Cow<'a, BigInt>) -> Self { + if let Some(w) = v.to_i128() { + SignedInteger(SignedIntegerRepr::I128(w)) + } else if let Some(w) = v.to_u128() { + SignedInteger(SignedIntegerRepr::U128(w)) + } else { + SignedInteger(SignedIntegerRepr::Big(Box::new(v.into_owned()))) + } } } -impl TryFrom<&SignedInteger> for u32 { - type Error = (); - fn try_from(v: &SignedInteger) -> Result { - u128::try_from(v)?.try_into().map_err(|_| ()) +impl<'a> From<&'a SignedInteger> for Cow<'a, BigInt> { + fn from(v: &'a SignedInteger) -> Self { + match v.repr() { + SignedIntegerRepr::I128(i) => Cow::Owned(BigInt::from(*i)), + SignedIntegerRepr::U128(u) => Cow::Owned(BigInt::from(*u)), + SignedIntegerRepr::Big(n) => Cow::Borrowed(n), + } } } -impl TryFrom<&SignedInteger> for i64 { - type Error = (); - fn try_from(v: &SignedInteger) -> Result { - i128::try_from(v)?.try_into().map_err(|_| ()) +//-- + +impl From for SignedInteger { + fn from(v: isize) -> Self { + SignedInteger(SignedIntegerRepr::I128(v as i128)) } } -impl TryFrom<&SignedInteger> for u64 { - type Error = (); - fn try_from(v: &SignedInteger) -> Result { - u128::try_from(v)?.try_into().map_err(|_| ()) +impl From for SignedInteger { + fn from(v: usize) -> Self { + SignedInteger(SignedIntegerRepr::U128(v as u128)) } }