ommx 2.5.2

Open Mathematical prograMming eXchange (OMMX)
Documentation
use crate::v1::{DecisionVariable, Function, Linear, Polynomial, Quadratic};
use std::ops::*;

impl From<&DecisionVariable> for Linear {
    fn from(dv: &DecisionVariable) -> Self {
        Linear::from(dv.id)
    }
}

macro_rules! impl_from_decision_variable {
    ($type:ty) => {
        impl From<&DecisionVariable> for $type {
            fn from(dv: &DecisionVariable) -> Self {
                Linear::from(dv).into()
            }
        }
    };
}
impl_from_decision_variable!(Quadratic);
impl_from_decision_variable!(Polynomial);
impl_from_decision_variable!(Function);

impl Add for &DecisionVariable {
    type Output = Linear;
    fn add(self, rhs: Self) -> Self::Output {
        Linear::from(self) + Linear::from(rhs)
    }
}

macro_rules! impl_add_decision_variable {
    ($t:ty) => {
        impl Add<$t> for &DecisionVariable {
            type Output = <Linear as Add<$t>>::Output;
            fn add(self, rhs: $t) -> Self::Output {
                Linear::from(self) + rhs
            }
        }
        impl Add<&DecisionVariable> for $t {
            type Output = <Linear as Add<$t>>::Output;
            fn add(self, rhs: &DecisionVariable) -> Self::Output {
                self + Linear::from(rhs)
            }
        }
    };
}
impl_add_decision_variable!(f64);
impl_add_decision_variable!(Linear);
impl_add_decision_variable!(Quadratic);
impl_add_decision_variable!(Polynomial);
impl_add_decision_variable!(Function);

impl Mul for &DecisionVariable {
    type Output = Quadratic;

    fn mul(self, rhs: Self) -> Self::Output {
        Linear::from(self) * Linear::from(rhs)
    }
}

macro_rules! impl_mul_decision_variable {
    ($t:ty) => {
        impl Mul<$t> for &DecisionVariable {
            type Output = <Linear as Mul<$t>>::Output;
            fn mul(self, rhs: $t) -> Self::Output {
                Linear::from(self) * rhs
            }
        }
        impl Mul<&DecisionVariable> for $t {
            type Output = <Linear as Mul<$t>>::Output;
            fn mul(self, rhs: &DecisionVariable) -> Self::Output {
                self * Linear::from(rhs)
            }
        }
    };
}
impl_mul_decision_variable!(f64);
impl_mul_decision_variable!(Linear);
impl_mul_decision_variable!(Quadratic);
impl_mul_decision_variable!(Polynomial);
impl_mul_decision_variable!(Function);

impl Neg for &DecisionVariable {
    type Output = Linear;

    fn neg(self) -> Self::Output {
        -Linear::from(self)
    }
}