use crate::integer::Integer;
use crate::natural::Natural;
use core::cmp::Ordering::{self, *};
use malachite_base::num::comparison::traits::{OrdProducts, OrdProductsNeg};
fn cmp_products_helper(
a: &Integer,
b: &Integer,
c: &Integer,
d: &Integer,
negate_right: bool,
) -> Ordering {
let left_zero = a.abs == 0u32 || b.abs == 0u32;
let right_zero = c.abs == 0u32 || d.abs == 0u32;
let left_positive = a.sign == b.sign;
let right_positive = (c.sign == d.sign) != negate_right;
if left_zero {
if right_zero {
Equal
} else if right_positive {
Less
} else {
Greater
}
} else if left_positive {
if right_zero || !right_positive {
Greater
} else {
Natural::cmp_products(&a.abs, &b.abs, &c.abs, &d.abs)
}
} else if right_zero || right_positive {
Less
} else {
Natural::cmp_products(&c.abs, &d.abs, &a.abs, &b.abs)
}
}
impl OrdProducts for Integer {
#[inline]
fn cmp_products(a: &Self, b: &Self, c: &Self, d: &Self) -> Ordering {
cmp_products_helper(a, b, c, d, false)
}
}
impl OrdProductsNeg for Integer {
#[inline]
fn cmp_products_neg(a: &Self, b: &Self, c: &Self, d: &Self) -> Ordering {
cmp_products_helper(a, b, c, d, true)
}
}