use super::Z;
use flint_sys::fmpz::{fmpz, fmpz_clear, fmpz_init_set};
impl Clone for Z {
fn clone(&self) -> Self {
let mut value = fmpz(0);
unsafe { fmpz_init_set(&mut value, &self.value) };
Self { value }
}
}
impl Drop for Z {
fn drop(&mut self) {
unsafe { fmpz_clear(&mut self.value) }
}
}
#[cfg(test)]
mod test_clone {
use super::Z;
#[test]
fn large_int() {
let max_1 = Z::from(u64::MAX);
let min_1 = Z::from(i64::MIN);
let max_2 = max_1.clone();
let min_2 = min_1.clone();
assert_ne!(max_1.value.0, max_2.value.0);
assert_ne!(min_1.value.0, min_2.value.0);
assert_eq!(max_1, max_2);
assert_eq!(min_1, min_2);
}
#[test]
fn small_int() {
let pos_1 = Z::from(16);
let zero_1 = Z::ZERO;
let neg_1 = Z::from(-16);
let pos_2 = pos_1.clone();
let zero_2 = zero_1.clone();
let neg_2 = neg_1.clone();
assert_eq!(pos_1.value.0, pos_2.value.0);
assert_eq!(zero_1.value.0, zero_2.value.0);
assert_eq!(neg_1.value.0, neg_2.value.0);
assert_eq!(pos_1, pos_2);
assert_eq!(zero_1, zero_2);
assert_eq!(neg_1, neg_2);
}
#[test]
#[allow(clippy::redundant_clone)]
fn keep_alive() {
let a: Z;
{
let b = Z::from(5);
a = b.clone();
}
assert_eq!(a, Z::from(5));
}
}
#[cfg(test)]
mod test_drop {
use super::Z;
#[test]
fn free_memory() {
let a = Z::from(u64::MAX);
let b = Z { value: a.value };
drop(a);
let c = Z::from(i64::MIN);
assert_eq!(c.value.0, b.value.0);
assert_ne!(b.value.0, Z::from(u64::MAX).value.0);
}
#[test]
fn memory_equality() {
let a = Z::from(u64::MAX);
let b = Z { value: a.value };
drop(a);
assert_eq!(b, Z::from(i64::MIN));
}
}