Skip to main content

nanvm_lib/
sign.rs

1use core::ops::Mul;
2
3/// Derived `Ord` follows the explicit discriminants, so `Negative < Positive`.
4#[repr(i8)]
5#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]
6pub enum Sign {
7    Positive = 1,
8    Negative = -1,
9}
10
11impl Sign {
12    pub const fn flip(self) -> Self {
13        match self {
14            Self::Positive => Self::Negative,
15            Self::Negative => Self::Positive,
16        }
17    }
18}
19
20/// The sign of a product or a quotient: `Positive` iff the signs agree.
21impl Mul for Sign {
22    type Output = Self;
23
24    fn mul(self, rhs: Self) -> Self {
25        if self == rhs {
26            Self::Positive
27        } else {
28            Self::Negative
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::Sign::{Negative, Positive};
36
37    #[test]
38    fn flip() {
39        assert_eq!(Positive.flip(), Negative);
40        assert_eq!(Negative.flip(), Positive);
41    }
42
43    #[test]
44    fn mul() {
45        assert_eq!(Positive * Positive, Positive);
46        assert_eq!(Positive * Negative, Negative);
47        assert_eq!(Negative * Positive, Negative);
48        assert_eq!(Negative * Negative, Positive);
49    }
50
51    #[test]
52    fn negative_is_less_than_positive() {
53        assert!(Negative < Positive);
54    }
55}