use crate::integer::Integer;
use crate::natural::Natural;
use core::cmp::Ordering::{self, *};
use malachite_base::num::comparison::traits::{OrdProduct, OrdProductNeg};
fn cmp_product_helper(a: &Integer, b: &Integer, c_sign: bool, c_abs: &Natural) -> Ordering {
let c_zero = *c_abs == 0u32;
if a.abs == 0u32 || b.abs == 0u32 {
if c_zero {
Equal
} else if c_sign {
Less
} else {
Greater
}
} else if a.sign == b.sign {
if c_zero || !c_sign {
Greater
} else {
Natural::cmp_product(&a.abs, &b.abs, c_abs)
}
} else if c_zero || c_sign {
Less
} else {
Natural::cmp_product(&a.abs, &b.abs, c_abs).reverse()
}
}
impl OrdProduct for Integer {
#[inline]
fn cmp_product(a: &Self, b: &Self, c: &Self) -> Ordering {
cmp_product_helper(a, b, c.sign, &c.abs)
}
}
impl OrdProductNeg for Integer {
#[inline]
fn cmp_product_neg(a: &Self, b: &Self, c: &Self) -> Ordering {
cmp_product_helper(a, b, !c.sign, &c.abs)
}
}