qfall_math/integer_mod_q/modulus_polynomial_ring_zq/
ownership.rs1use super::ModulusPolynomialRingZq;
15use std::rc::Rc;
16
17impl Clone for ModulusPolynomialRingZq {
18 fn clone(&self) -> Self {
33 Self {
34 modulus: Rc::clone(&self.modulus),
35 ntt_basis: Rc::clone(&self.ntt_basis),
36 non_zero: self.non_zero.clone(),
37 }
38 }
39}
40
41#[cfg(test)]
43mod test_clone {
44 use super::ModulusPolynomialRingZq;
45 use std::{rc::Rc, str::FromStr};
46
47 #[test]
49 fn references_increased() {
50 let a = ModulusPolynomialRingZq::from_str("3 1 0 1 mod 17").unwrap();
51 assert_eq!(Rc::strong_count(&a.modulus), 1);
52
53 let b = a.clone();
54
55 assert_eq!(Rc::strong_count(&a.modulus), 2);
56 assert_eq!(Rc::strong_count(&b.modulus), 2);
57
58 let c = b.clone();
59
60 assert_eq!(Rc::strong_count(&a.modulus), 3);
61 assert_eq!(Rc::strong_count(&b.modulus), 3);
62 assert_eq!(Rc::strong_count(&c.modulus), 3);
63 }
64}
65
66#[cfg(test)]
68mod test_drop {
69 use super::ModulusPolynomialRingZq;
70 use std::{rc::Rc, str::FromStr};
71
72 #[test]
74 fn references_decreased() {
75 let a = ModulusPolynomialRingZq::from_str("3 1 0 1 mod 17").unwrap();
76 assert_eq!(Rc::strong_count(&a.modulus), 1);
77
78 {
79 let b = a.clone();
80
81 assert_eq!(Rc::strong_count(&a.modulus), 2);
82 assert_eq!(Rc::strong_count(&b.modulus), 2);
83 }
84
85 assert_eq!(Rc::strong_count(&a.modulus), 1);
86
87 let b = a.clone();
88 assert_eq!(Rc::strong_count(&a.modulus), 2);
89 assert_eq!(Rc::strong_count(&b.modulus), 2);
90
91 let c = b.clone();
92 assert_eq!(Rc::strong_count(&a.modulus), 3);
93 assert_eq!(Rc::strong_count(&b.modulus), 3);
94 assert_eq!(Rc::strong_count(&c.modulus), 3);
95
96 drop(a);
97 assert_eq!(Rc::strong_count(&b.modulus), 2);
98 }
99}