memory-spec 0.3.0

A single source of truth for all your memory.x files
Documentation
use std::ops::{Add, Mul};

#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Checked<T>(pub Option<T>);

impl Add<i64> for Checked<i64> {
    type Output = Self;
    fn add(self, rhs: i64) -> Self {
        match self.0 {
            None => self,
            Some(n) => Self(n.checked_add(rhs)),
        }
    }
}

impl Add<Checked<i64>> for i64 {
    type Output = Checked<i64>;
    fn add(self, rhs: Checked<i64>) -> Checked<i64> {
        match rhs.0 {
            None => rhs,
            Some(n) => Checked(n.checked_add(self)),
        }
    }
}

impl Add for Checked<i64> {
    type Output = Self;
    fn add(self, rhs: Checked<i64>) -> Self {
        match (self.0, rhs.0) {
            (None, _) | (_, None) => Self(None),
            (Some(l), Some(r)) => Self(l.checked_add(r)),
        }
    }
}

impl Mul<i64> for Checked<i64> {
    type Output = Self;
    fn mul(self, rhs: i64) -> Self {
        match self.0 {
            None => self,
            Some(n) => Self(n.checked_mul(rhs)),
        }
    }
}

impl Mul<Checked<i64>> for i64 {
    type Output = Checked<i64>;
    fn mul(self, rhs: Checked<i64>) -> Checked<i64> {
        match rhs.0 {
            None => rhs,
            Some(n) => Checked(n.checked_mul(self)),
        }
    }
}

impl Mul for Checked<i64> {
    type Output = Self;
    fn mul(self, rhs: Checked<i64>) -> Self {
        match (self.0, rhs.0) {
            (None, _) | (_, None) => Self(None),
            (Some(l), Some(r)) => Self(l.checked_mul(r)),
        }
    }
}