1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
// Copyright © 2024 Mikhail Hogrefe
//
// This file is part of Malachite.
//
// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
use core::cmp::Ordering::{self, *};
/// Determines equality between the absolute values of two numbers.
pub trait EqAbs<Rhs: ?Sized = Self> {
/// Compares the absolute values of two numbers for equality, taking both by reference.
fn eq_abs(&self, other: &Rhs) -> bool;
/// Compares the absolute values of two numbers for inequality, taking both by reference.
///
/// # Worst-case complexity
/// Same as the time and additional memory complexity of [`eq_abs`](Self::eq_abs).
#[inline]
fn ne_abs(&self, other: &Rhs) -> bool {
!self.eq_abs(other)
}
}
/// Determines equality between the absolute values of two numbers, where some pairs of numbers may
/// not be comparable.
pub trait PartialOrdAbs<Rhs: ?Sized = Self> {
/// Compares the absolute values of two numbers, taking both by reference.
///
/// If the two values are not comparable, `None` is returned.
fn partial_cmp_abs(&self, other: &Rhs) -> Option<Ordering>;
/// Determines whether the absolute value of one number is less than the absolute value of
/// another.
///
/// # Worst-case complexity
/// Same as the time and additional memory complexity of
/// [`partial_cmp_abs`](Self::partial_cmp_abs).
#[inline]
fn lt_abs(&self, other: &Rhs) -> bool {
matches!(self.partial_cmp_abs(other), Some(Less))
}
/// Determines whether the absolute value of one number is less than or equal to the absolute
/// value of another.
///
/// # Worst-case complexity
/// Same as the time and additional memory complexity of
/// [`partial_cmp_abs`](Self::partial_cmp_abs).
#[inline]
fn le_abs(&self, other: &Rhs) -> bool {
matches!(self.partial_cmp_abs(other), Some(Less | Equal))
}
/// Determines whether the absolute value of one number is greater than the absolute value of
/// another.
///
/// # Worst-case complexity
/// Same as the time and additional memory complexity of
/// [`partial_cmp_abs`](Self::partial_cmp_abs).
#[inline]
fn gt_abs(&self, other: &Rhs) -> bool {
matches!(self.partial_cmp_abs(other), Some(Greater))
}
/// Determines whether the absolute value of one number is greater than or equal to the absolute
/// value of another.
///
/// # Worst-case complexity
/// Same as the time and additional memory complexity of
/// [`partial_cmp_abs`](Self::partial_cmp_abs).
#[inline]
fn ge_abs(&self, other: &Rhs) -> bool {
matches!(self.partial_cmp_abs(other), Some(Greater | Equal))
}
}
/// Compares the absolute values of two numbers.
pub trait OrdAbs: Eq + PartialOrdAbs<Self> {
fn cmp_abs(&self, other: &Self) -> Ordering;
}