macro_rules! decl_eq_signed_int {
($Type:ident, $Src:ty) => {
impl<const SCALE: u32> ::core::cmp::PartialEq<$Src> for $Type<SCALE> {
#[inline]
fn eq(&self, other: &$Src) -> bool {
let rhs = $crate::int::types::Int::<2>::from_i128(*other as i128);
self.to_bits().cmp_cross_scaled(rhs, SCALE) == ::core::cmp::Ordering::Equal
}
}
impl<const SCALE: u32> ::core::cmp::PartialEq<$Type<SCALE>> for $Src {
#[inline]
fn eq(&self, other: &$Type<SCALE>) -> bool {
other == self
}
}
};
}
macro_rules! decl_eq_i128 {
($Type:ident) => {
impl<const SCALE: u32> ::core::cmp::PartialEq<i128> for $Type<SCALE> {
#[inline]
fn eq(&self, other: &i128) -> bool {
let rhs = $crate::int::types::Int::<2>::from_i128(*other);
self.to_bits().cmp_cross_scaled(rhs, SCALE) == ::core::cmp::Ordering::Equal
}
}
impl<const SCALE: u32> ::core::cmp::PartialEq<$Type<SCALE>> for i128 {
#[inline]
fn eq(&self, other: &$Type<SCALE>) -> bool {
other == self
}
}
};
}
macro_rules! decl_eq_unsigned_int {
($Type:ident, $Src:ty) => {
impl<const SCALE: u32> ::core::cmp::PartialEq<$Src> for $Type<SCALE> {
#[inline]
fn eq(&self, other: &$Src) -> bool {
let rhs = $crate::int::types::Int::<2>::from_u128(*other as u128);
self.to_bits().cmp_cross_scaled(rhs, SCALE) == ::core::cmp::Ordering::Equal
}
}
impl<const SCALE: u32> ::core::cmp::PartialEq<$Type<SCALE>> for $Src {
#[inline]
fn eq(&self, other: &$Type<SCALE>) -> bool {
other == self
}
}
};
}
macro_rules! decl_eq_u128 {
($Type:ident) => {
impl<const SCALE: u32> ::core::cmp::PartialEq<u128> for $Type<SCALE> {
#[inline]
fn eq(&self, other: &u128) -> bool {
let rhs = $crate::int::types::Int::<2>::from_u128(*other);
self.to_bits().cmp_cross_scaled(rhs, SCALE) == ::core::cmp::Ordering::Equal
}
}
impl<const SCALE: u32> ::core::cmp::PartialEq<$Type<SCALE>> for u128 {
#[inline]
fn eq(&self, other: &$Type<SCALE>) -> bool {
other == self
}
}
};
}
#[cfg(feature = "std")]
macro_rules! decl_eq_float {
($Type:ident, $Src:ty) => {
impl<const SCALE: u32> ::core::cmp::PartialEq<$Src> for $Type<SCALE> {
#[inline]
fn eq(&self, other: &$Src) -> bool {
if !other.is_finite() {
return false;
}
let f = *other as f64;
self.to_bits().cmp_f64_exact(SCALE, f) == ::core::cmp::Ordering::Equal
}
}
impl<const SCALE: u32> ::core::cmp::PartialEq<$Type<SCALE>> for $Src {
#[inline]
fn eq(&self, other: &$Type<SCALE>) -> bool {
other == self
}
}
};
}
macro_rules! decl_eq_all_integers {
($Type:ident) => {
$crate::macros::equalities::decl_eq_signed_int!($Type, i8);
$crate::macros::equalities::decl_eq_signed_int!($Type, i16);
$crate::macros::equalities::decl_eq_signed_int!($Type, i32);
$crate::macros::equalities::decl_eq_signed_int!($Type, i64);
$crate::macros::equalities::decl_eq_signed_int!($Type, isize);
$crate::macros::equalities::decl_eq_i128!($Type);
$crate::macros::equalities::decl_eq_unsigned_int!($Type, u8);
$crate::macros::equalities::decl_eq_unsigned_int!($Type, u16);
$crate::macros::equalities::decl_eq_unsigned_int!($Type, u32);
$crate::macros::equalities::decl_eq_unsigned_int!($Type, u64);
$crate::macros::equalities::decl_eq_unsigned_int!($Type, usize);
$crate::macros::equalities::decl_eq_u128!($Type);
};
}
pub(crate) use decl_eq_all_integers;
pub(crate) use decl_eq_i128;
pub(crate) use decl_eq_signed_int;
pub(crate) use decl_eq_u128;
pub(crate) use decl_eq_unsigned_int;
#[cfg(feature = "std")]
pub(crate) use decl_eq_float;