pub trait IntSignOps: Sized {
fn checked_abs(self) -> Option<Self>;
fn checked_neg(self) -> Option<Self>;
fn saturating_abs(self) -> Self;
fn saturating_neg(self) -> Self;
fn wrapping_abs(self) -> Self;
fn wrapping_neg(self) -> Self;
fn overflowing_abs(self) -> (Self, bool);
fn overflowing_neg(self) -> (Self, bool);
}
macro_rules! impl_int_sign_uint {
($($t:ty),*) => {
$(impl IntSignOps for $t {
#[inline] fn checked_abs(self) -> Option<Self> { Some(self) }
#[inline] fn checked_neg(self) -> Option<Self> { self.checked_neg() }
#[inline] fn saturating_abs(self) -> Self { self }
#[inline] fn saturating_neg(self) -> Self { 0 }
#[inline] fn wrapping_abs(self) -> Self { self }
#[inline] fn wrapping_neg(self) -> Self { self.wrapping_neg() }
#[inline] fn overflowing_abs(self) -> (Self, bool) { (self, false) }
#[inline] fn overflowing_neg(self) -> (Self, bool) { self.overflowing_neg() }
})*
};
}
impl_int_sign_uint!(u8, u16, u32, u64, u128, usize);
macro_rules! impl_int_sign_int {
($($t:ty),*) => {
$(impl IntSignOps for $t {
#[inline] fn checked_abs(self) -> Option<Self> { self.checked_abs() }
#[inline] fn checked_neg(self) -> Option<Self> { self.checked_neg() }
#[inline] fn saturating_abs(self) -> Self { self.saturating_abs() }
#[inline] fn saturating_neg(self) -> Self { self.saturating_neg() }
#[inline] fn wrapping_abs(self) -> Self { self.wrapping_abs() }
#[inline] fn wrapping_neg(self) -> Self { self.wrapping_neg() }
#[inline] fn overflowing_abs(self) -> (Self, bool) { self.overflowing_abs() }
#[inline] fn overflowing_neg(self) -> (Self, bool) { self.overflowing_neg() }
})*
};
}
impl_int_sign_int!(i8, i16, i32, i64, i128, isize);