osiris_process/
compare.rs

1use osiris_data::data::atomic::Word;
2
3#[derive(Copy, Clone, Eq, PartialEq)]
4pub enum Compare {
5    LT,
6    LE,
7    NE,
8    EQ,
9    GE,
10    GT,
11}
12
13impl Compare {
14
15    /// Parses a `u16` to create a [Compare] value.
16    ///
17    /// Returns [None] if `target_arg > 5`.
18    pub fn from(target_arg: u16) -> Option<Self> {
19        match target_arg {
20            0 => Some(Compare::LT),
21            1 => Some(Compare::LE),
22            2 => Some(Compare::NE),
23            3 => Some(Compare::EQ),
24            4 => Some(Compare::GE),
25            5 => Some(Compare::GT),
26            _ => None
27        }
28    }
29
30    pub fn to_u16(&self) -> u16 {
31        match self {
32            Compare::LT => 0,
33            Compare::LE => 1,
34            Compare::NE => 2,
35            Compare::EQ => 3,
36            Compare::GE => 4,
37            Compare::GT => 5,
38        }
39    }
40
41    pub fn cmp(a: Word, b: Word) -> i64 {
42        match a {
43            a if a > b => 1,
44            a if a < b => -1,
45            _ => 0
46        }
47    }
48
49    pub fn is(&self, cmp: i64) -> bool {
50        match self {
51            Compare::EQ => matches!(cmp, 0),
52            Compare::LT => matches!(cmp, -1),
53            Compare::GT => matches!(cmp, 1),
54            Compare::LE => matches!(cmp, -1 | 0),
55            Compare::NE => matches!(cmp, -1 | 1),
56            Compare::GE => matches!(cmp, 0 | 1),
57        }
58    }
59
60    pub fn check(&self, a: Word, b: Word) -> bool { self.is(Self::cmp(a, b)) }
61}