use core::cmp::Ordering;
use core::ops::{Mul, Neg};
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
#[repr(i8)]
pub enum Sign {
Negative = -1,
Zero = 0,
Positive = 1,
}
impl Sign {
#[must_use]
pub fn of(x: f64) -> Sign {
debug_assert!(!x.is_nan(), "Sign::of called with NaN");
if x > 0.0 {
Sign::Positive
} else if x < 0.0 {
Sign::Negative
} else {
Sign::Zero
}
}
#[must_use]
pub fn is_zero(self) -> bool {
self == Sign::Zero
}
#[must_use]
pub fn is_positive(self) -> bool {
self == Sign::Positive
}
#[must_use]
pub fn is_negative(self) -> bool {
self == Sign::Negative
}
}
impl Neg for Sign {
type Output = Sign;
fn neg(self) -> Sign {
match self {
Sign::Negative => Sign::Positive,
Sign::Zero => Sign::Zero,
Sign::Positive => Sign::Negative,
}
}
}
impl Mul for Sign {
type Output = Sign;
fn mul(self, rhs: Sign) -> Sign {
match (self, rhs) {
(Sign::Zero, _) | (_, Sign::Zero) => Sign::Zero,
(a, b) if a == b => Sign::Positive,
_ => Sign::Negative,
}
}
}
impl From<Sign> for i8 {
fn from(sign: Sign) -> i8 {
sign as i8
}
}
impl From<Ordering> for Sign {
fn from(ordering: Ordering) -> Sign {
match ordering {
Ordering::Less => Sign::Negative,
Ordering::Equal => Sign::Zero,
Ordering::Greater => Sign::Positive,
}
}
}