use super::Z;
use crate::{integer_mod_q::Modulus, macros::for_others::implement_for_others};
use flint_sys::fmpz::{fmpz, fmpz_cmp, fmpz_equal};
use std::cmp::Ordering;
impl PartialEq for Z {
fn eq(&self, other: &Self) -> bool {
unsafe { 1 == fmpz_equal(&self.value, &other.value) }
}
}
impl Eq for Z {}
implement_for_others!(Z, Z, PartialEq for fmpz i8 i16 i32 i64 u8 u16 u32 u64);
impl PartialOrd for Z {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Z {
fn cmp(&self, other: &Self) -> Ordering {
unsafe { fmpz_cmp(&self.value, &other.value).cmp(&0) }
}
}
impl PartialOrd<Modulus> for Z {
fn partial_cmp(&self, other: &Modulus) -> Option<Ordering> {
Some(unsafe { fmpz_cmp(&self.value, &other.modulus.n[0]).cmp(&0) })
}
}
implement_for_others!(Z, Z, PartialOrd for fmpz i8 i16 i32 i64 u8 u16 u32 u64);
#[cfg(test)]
mod test_partial_eq_z {
use super::Z;
#[test]
#[allow(clippy::op_ref)]
fn availability() {
let z = Z::ONE;
assert!(z == z);
assert!(&z == &z);
}
#[test]
#[allow(clippy::op_ref)]
fn equal_call_methods() {
let one_1 = Z::from(1);
let one_2 = Z::from(1);
assert!(one_1 == one_2);
assert!(&one_1 == &one_2);
assert!(one_1.eq(&one_2));
assert!(Z::eq(&one_1, &one_2));
assert_eq!(one_1, one_2);
}
#[test]
#[allow(clippy::op_ref)]
fn not_equal_call_methods() {
let one = Z::from(1);
let two = Z::from(2);
assert!(one != two);
assert!(&one != &two);
assert!(one.ne(&two));
assert!(Z::ne(&one, &two));
assert_ne!(one, two);
}
#[test]
fn equal_small() {
let small_1 = Z::from(10);
let small_2 = Z::from(10);
assert!(small_1 == small_2);
assert!(small_2 == small_1);
assert!(small_1 == small_1);
}
#[test]
fn not_equal_small() {
let small_1 = Z::from(10);
let negative = Z::from(-1);
assert!(small_1 != negative);
assert!(negative != small_1);
}
#[test]
fn equal_large() {
let max_1 = Z::from(u64::MAX);
let max_2 = Z::from(u64::MAX);
let min = Z::from(i64::MIN);
assert!(max_1 == max_2);
assert!(max_2 == max_1);
assert!(max_1 == max_1);
assert!(min == min);
}
#[test]
fn not_equal_large() {
let max_1 = Z::from(u64::MAX);
let min = Z::from(i64::MIN);
assert!(max_1 != min);
assert!(min != max_1);
}
#[test]
fn not_equal_large_small() {
let max = Z::from(u64::MAX);
let small_positive = Z::from(1);
let small_negative = Z::from(-1);
let min = Z::from(i64::MIN);
assert!(max != small_negative);
assert!(small_negative != max);
assert!(max != small_positive);
assert!(small_positive != max);
assert!(min != small_negative);
assert!(small_negative != min);
assert!(min != small_positive);
assert!(small_positive != min);
}
}
#[cfg(test)]
mod test_partial_eq_z_other {
use super::Z;
#[test]
#[allow(clippy::op_ref)]
fn availability() {
let z = Z::from(2);
assert!(z == z.value);
assert!(z == 2i8);
assert!(z == 2u8);
assert!(z == 2i16);
assert!(z == 2u16);
assert!(z == 2i32);
assert!(z == 2u32);
assert!(z == 2i64);
assert!(z == 2u64);
assert!(z.value == z);
assert!(2i8 == z);
assert!(2u8 == z);
assert!(2i16 == z);
assert!(2u16 == z);
assert!(2i32 == z);
assert!(2u32 == z);
assert!(2i64 == z);
assert!(2u64 == z);
assert!(&z == &2i8);
assert!(&2i8 == &z);
}
}
#[cfg(test)]
#[allow(clippy::neg_cmp_op_on_partial_ord)]
mod test_partial_ord {
use super::Z;
#[test]
fn less_small() {
let small_positive_1 = Z::from(1);
let small_negative = Z::from(-1);
assert!(small_negative < small_positive_1);
}
#[test]
fn less_large_small() {
let max = Z::from(u64::MAX);
let small_positive = Z::from(1);
let small_negative = Z::from(-1);
let max_negative = Z::from(i64::MIN);
assert!(small_positive < max);
assert!(small_negative < max);
assert!(max_negative < small_positive);
assert!(max_negative < small_negative);
}
#[test]
fn less_large() {
let max_1 = Z::from(u64::MAX);
let max_negative = Z::from(i64::MIN);
assert!(max_negative < max_1);
}
#[test]
fn less_equal_small() {
let small_positive_1 = Z::from(1);
let small_positive_2 = Z::from(1);
let small_negative = Z::from(-1);
assert!(small_positive_1 <= small_positive_2);
assert!(small_positive_2 <= small_positive_1);
assert!(small_positive_1 <= small_positive_1);
assert!(small_negative <= small_positive_1);
assert!(small_negative <= small_negative);
}
#[test]
fn less_equal_large_small() {
let max = Z::from(u64::MAX);
let small_positive = Z::from(1);
let small_negative = Z::from(-1);
let max_negative = Z::from(i64::MIN);
assert!(small_positive <= max);
assert!(small_negative <= max);
assert!(max_negative <= small_positive);
assert!(max_negative <= small_negative);
}
#[test]
fn less_equal_large() {
let max_1 = Z::from(u64::MAX);
let max_2 = Z::from(u64::MAX);
let max_negative = Z::from(i64::MIN);
assert!(max_1 <= max_2);
assert!(max_2 <= max_1);
assert!(max_1 <= max_1);
assert!(max_negative <= max_1);
assert!(max_negative <= max_negative);
}
#[test]
fn greater_small() {
let small_positive_1 = Z::from(1);
let small_negative = Z::from(-1);
assert!(small_positive_1 > small_negative);
}
#[test]
fn greater_large_small() {
let max = Z::from(u64::MAX);
let small_positive = Z::from(1);
let small_negative = Z::from(-1);
let max_negative = Z::from(i64::MIN);
assert!(max > small_positive);
assert!(max > small_negative);
assert!(small_positive > max_negative);
assert!(small_negative > max_negative);
}
#[test]
fn greater_large() {
let max_1 = Z::from(u64::MAX);
let max_negative = Z::from(i64::MIN);
assert!(max_1 > max_negative);
}
#[test]
fn greater_equal_small() {
let small_positive_1 = Z::from(1);
let small_positive_2 = Z::from(1);
let small_negative = Z::from(-1);
assert!(small_positive_1 >= small_positive_2);
assert!(small_positive_2 >= small_positive_1);
assert!(small_positive_1 >= small_positive_1);
assert!(small_positive_1 >= small_negative);
assert!(small_negative >= small_negative);
}
#[test]
fn greater_equal_large_small() {
let max = Z::from(u64::MAX);
let small_positive = Z::from(1);
let small_negative = Z::from(-1);
let max_negative = Z::from(i64::MIN);
assert!(max >= small_positive);
assert!(max >= small_negative);
assert!(small_positive >= max_negative);
assert!(small_negative >= max_negative);
}
#[test]
fn greater_equal_large() {
let max_1 = Z::from(u64::MAX);
let max_2 = Z::from(u64::MAX);
let max_negative = Z::from(i64::MIN);
assert!(max_1 >= max_2);
assert!(max_2 >= max_1);
assert!(max_1 >= max_1);
assert!(max_1 >= max_negative);
assert!(max_negative >= max_negative);
}
}
#[cfg(test)]
mod test_partial_ord_z_other {
use super::Z;
use crate::integer_mod_q::Modulus;
#[test]
#[allow(clippy::op_ref)]
fn availability() {
let z = Z::from(2);
let modulus = Modulus::from(2);
assert!(z <= modulus);
assert!(z <= z.value);
assert!(z <= 2i8);
assert!(z <= 2u8);
assert!(z <= 2i16);
assert!(z <= 2u16);
assert!(z <= 2i32);
assert!(z <= 2u32);
assert!(z <= 2i64);
assert!(z <= 2u64);
assert!(z.value >= z);
assert!(2i8 >= z);
assert!(2u8 >= z);
assert!(2i16 >= z);
assert!(2u16 >= z);
assert!(2i32 >= z);
assert!(2u32 >= z);
assert!(2i64 >= z);
assert!(2u64 >= z);
assert!(&z <= &modulus);
assert!(&z <= &2i8);
assert!(&2i8 >= &z);
}
}
#[cfg(test)]
mod test_ord {
use super::Z;
use std::cmp::{max, min};
#[test]
fn default_implementations_small() {
let a: Z = Z::from(10);
let b: Z = Z::from(42);
assert_eq!(b, max(a.clone(), b.clone()));
assert_eq!(a, min(a.clone(), b.clone()));
assert_eq!(a, Z::ZERO.clamp(a.clone(), b.clone()));
assert_eq!(a, a.clone().clamp(Z::ZERO, b.clone()));
assert_eq!(a, b.clamp(Z::ZERO, a.clone()));
}
#[test]
fn default_implementations_large() {
let a: Z = Z::from(i64::MAX);
let b: Z = Z::from(u64::MAX);
assert_eq!(b, max(a.clone(), b.clone()));
assert_eq!(a, min(a.clone(), b.clone()));
assert_eq!(a, Z::ZERO.clamp(a.clone(), b.clone()));
assert_eq!(a, a.clone().clamp(Z::ZERO, b.clone()));
assert_eq!(a, b.clamp(Z::ZERO, a.clone()));
}
}