use crate::natural::Natural;
use core::cmp::Ordering::{self, *};
use malachite_base::num::comparison::traits::OrdProducts;
use malachite_base::num::logic::traits::SignificantBits;
const fn from_pairing(x: Ordering, y: Ordering) -> Option<Ordering> {
match (x, y) {
(Equal, o) | (o, Equal) => Some(o),
(Less, Less) => Some(Less),
(Greater, Greater) => Some(Greater),
_ => None,
}
}
impl OrdProducts for Natural {
fn cmp_products(a: &Self, b: &Self, c: &Self, d: &Self) -> Ordering {
let left_zero = *a == 0u32 || *b == 0u32;
let right_zero = *c == 0u32 || *d == 0u32;
if left_zero || right_zero {
return right_zero.cmp(&left_zero);
}
let left_bits = a.significant_bits() + b.significant_bits();
let right_bits = c.significant_bits() + d.significant_bits();
if right_bits + 2 <= left_bits {
return Greater;
} else if left_bits + 2 <= right_bits {
return Less;
}
if let Some(o) = from_pairing(a.cmp(c), b.cmp(d)) {
return o;
}
if let Some(o) = from_pairing(a.cmp(d), b.cmp(c)) {
return o;
}
(a * b).cmp(&(c * d))
}
}