osiris-process 0.3.1

A processor implementation.
Documentation
use osiris_data::data::atomic::Word;

#[derive(Copy, Clone, Eq, PartialEq)]
pub enum Compare {
    LT,
    LE,
    NE,
    EQ,
    GE,
    GT,
}

impl Compare {

    /// Parses a `u16` to create a [Compare] value.
    ///
    /// Returns [None] if `target_arg > 5`.
    pub fn from(target_arg: u16) -> Option<Self> {
        match target_arg {
            0 => Some(Compare::LT),
            1 => Some(Compare::LE),
            2 => Some(Compare::NE),
            3 => Some(Compare::EQ),
            4 => Some(Compare::GE),
            5 => Some(Compare::GT),
            _ => None
        }
    }

    pub fn to_u16(&self) -> u16 {
        match self {
            Compare::LT => 0,
            Compare::LE => 1,
            Compare::NE => 2,
            Compare::EQ => 3,
            Compare::GE => 4,
            Compare::GT => 5,
        }
    }

    pub fn cmp(a: Word, b: Word) -> i64 {
        match a {
            a if a > b => 1,
            a if a < b => -1,
            _ => 0
        }
    }

    pub fn is(&self, cmp: i64) -> bool {
        match self {
            Compare::EQ => matches!(cmp, 0),
            Compare::LT => matches!(cmp, -1),
            Compare::GT => matches!(cmp, 1),
            Compare::LE => matches!(cmp, -1 | 0),
            Compare::NE => matches!(cmp, -1 | 1),
            Compare::GE => matches!(cmp, 0 | 1),
        }
    }

    pub fn check(&self, a: Word, b: Word) -> bool { self.is(Self::cmp(a, b)) }
}