use super::ModulusPolynomialRingZq;
use std::rc::Rc;
impl Clone for ModulusPolynomialRingZq {
fn clone(&self) -> Self {
Self {
modulus: Rc::clone(&self.modulus),
ntt_basis: Rc::clone(&self.ntt_basis),
non_zero: self.non_zero.clone(),
}
}
}
#[cfg(test)]
mod test_clone {
use super::ModulusPolynomialRingZq;
use std::{rc::Rc, str::FromStr};
#[test]
fn references_increased() {
let a = ModulusPolynomialRingZq::from_str("3 1 0 1 mod 17").unwrap();
assert_eq!(Rc::strong_count(&a.modulus), 1);
let b = a.clone();
assert_eq!(Rc::strong_count(&a.modulus), 2);
assert_eq!(Rc::strong_count(&b.modulus), 2);
let c = b.clone();
assert_eq!(Rc::strong_count(&a.modulus), 3);
assert_eq!(Rc::strong_count(&b.modulus), 3);
assert_eq!(Rc::strong_count(&c.modulus), 3);
}
}
#[cfg(test)]
mod test_drop {
use super::ModulusPolynomialRingZq;
use std::{rc::Rc, str::FromStr};
#[test]
fn references_decreased() {
let a = ModulusPolynomialRingZq::from_str("3 1 0 1 mod 17").unwrap();
assert_eq!(Rc::strong_count(&a.modulus), 1);
{
let b = a.clone();
assert_eq!(Rc::strong_count(&a.modulus), 2);
assert_eq!(Rc::strong_count(&b.modulus), 2);
}
assert_eq!(Rc::strong_count(&a.modulus), 1);
let b = a.clone();
assert_eq!(Rc::strong_count(&a.modulus), 2);
assert_eq!(Rc::strong_count(&b.modulus), 2);
let c = b.clone();
assert_eq!(Rc::strong_count(&a.modulus), 3);
assert_eq!(Rc::strong_count(&b.modulus), 3);
assert_eq!(Rc::strong_count(&c.modulus), 3);
drop(a);
assert_eq!(Rc::strong_count(&b.modulus), 2);
}
}