use crate::{Decimal, context::get_context, error};
use std::cmp::Ordering;
use mpdec_sys::{
mpd_iseven, mpd_isfinite, mpd_isinfinite, mpd_isinteger, mpd_isnan, mpd_isnegative,
mpd_isnormal, mpd_isodd, mpd_ispositive, mpd_isqnan, mpd_issigned, mpd_issnan, mpd_isspecial,
mpd_issubnormal, mpd_iszero,
};
#[rustfmt::skip]
impl Decimal {
pub fn is_finite(&self) -> bool { unsafe { mpd_isfinite(self.inner) != 0 } }
pub fn is_infinite(&self) -> bool { unsafe { mpd_isinfinite(self.inner) != 0 } }
pub fn is_nan(&self) -> bool { unsafe { mpd_isnan(self.inner) != 0 } }
pub fn is_negative(&self) -> bool { unsafe { mpd_isnegative(self.inner) != 0 } }
pub fn is_positive(&self) -> bool { unsafe { mpd_ispositive(self.inner) != 0 } }
pub fn is_qnan(&self) -> bool { unsafe { mpd_isqnan(self.inner) != 0 } }
pub fn is_signed(&self) -> bool { unsafe { mpd_issigned(self.inner) != 0 } }
pub fn is_snan(&self) -> bool { unsafe { mpd_issnan(self.inner) != 0 } }
pub fn is_special(&self) -> bool { unsafe { mpd_isspecial(self.inner) != 0 } }
pub fn is_zero(&self) -> bool { unsafe { mpd_iszero(self.inner) != 0 } }
pub fn is_normal(&self) -> bool { unsafe { mpd_isnormal(self.inner, &mut *get_context()) != 0 } }
pub fn is_subnormal(&self) -> bool { unsafe { mpd_issubnormal(self.inner, &mut *get_context()) != 0 } }
pub fn is_integer(&self) -> bool { unsafe { mpd_isinteger(self.inner) != 0 } }
pub fn is_odd(&self) -> bool { unsafe { mpd_isodd(self.inner) != 0 } }
pub fn is_even(&self) -> bool { unsafe { mpd_iseven(self.inner) != 0 } }
}
impl PartialEq for Decimal {
fn eq(&self, other: &Self) -> bool {
let cmp_res = unsafe { mpdec_sys::mpd_cmp(self.inner, other.inner, &mut *get_context()) };
error::check_for_error().map_or(false, |_| cmp_res == 0)
}
}
impl Eq for Decimal {}
#[rustfmt::skip]
impl PartialOrd for Decimal {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
let cmp_res = unsafe { mpdec_sys::mpd_cmp(self.inner, other.inner, &mut *get_context()) };
if error::check_for_error().is_err() {
return None;
} else {
Some(match cmp_res {
-1 => Ordering::Less,
0 => Ordering::Equal,
1 => Ordering::Greater,
_ => unreachable!(),
})
}
}
}
impl Ord for Decimal {
fn cmp(&self, other: &Self) -> Ordering {
self.partial_cmp(other)
.expect("Error occurred during decimal comparison")
}
}