use super::PolyOverZ;
use flint_sys::fmpz_poly::{fmpz_poly_clear, fmpz_poly_set};
impl Clone for PolyOverZ {
fn clone(&self) -> Self {
let mut value = PolyOverZ::default();
unsafe { fmpz_poly_set(&mut value.poly, &self.poly) }
value
}
}
impl Drop for PolyOverZ {
fn drop(&mut self) {
unsafe { fmpz_poly_clear(&mut self.poly) }
}
}
#[cfg(test)]
mod test_clone {
use crate::integer::PolyOverZ;
use std::str::FromStr;
#[test]
fn large_entries() {
let input = format!("2 {} -{}", u64::MAX, u64::MAX);
let poly_1 = PolyOverZ::from_str(&input).unwrap();
let poly_2 = poly_1.clone();
unsafe {
assert_ne!((*poly_1.poly.coeffs).0, (*poly_2.poly.coeffs).0);
}
assert_eq!(poly_1.to_string(), poly_2.to_string());
}
#[test]
fn small_examples() {
let pos_1 = PolyOverZ::from_str("2 0 11").unwrap();
let zero_1 = PolyOverZ::from_str("2 0 -11").unwrap();
let neg_1 = PolyOverZ::from_str("2 0 1100").unwrap();
let pos_2 = pos_1.clone();
let zero_2 = zero_1.clone();
let neg_2 = neg_1.clone();
assert_eq!(pos_1.to_string(), pos_2.to_string());
assert_eq!(zero_1.to_string(), zero_2.to_string());
assert_eq!(neg_1.to_string(), neg_2.to_string());
}
#[test]
#[allow(clippy::redundant_clone)]
fn keep_alive() {
let a: PolyOverZ;
{
let b = PolyOverZ::from_str("2 0 1").unwrap();
a = b.clone();
}
assert_eq!("2 0 1", a.to_string());
}
}
#[cfg(test)]
mod test_drop {
use super::PolyOverZ;
use std::{collections::HashSet, str::FromStr};
fn create_and_drop_poly_over_z() -> i64 {
let a = PolyOverZ::from_str("2 36893488147419103232 36893488147419103233").unwrap();
unsafe { *a.poly.coeffs }.0
}
#[test]
fn free_memory() {
let mut set = HashSet::new();
for _i in 0..5 {
set.insert(create_and_drop_poly_over_z());
}
assert!(set.len() < 5);
let a = PolyOverZ::from_str("2 36893488147419103232 36893488147419103233").unwrap();
let storage_point = unsafe { *a.poly.coeffs }.0;
let d = PolyOverZ::from_str("2 36893488147419103232 36893488147419103233").unwrap();
assert_ne!(storage_point, unsafe { *d.poly.coeffs }.0);
}
}