use backend::{VecZnx, VecZnxToMut, VecZnxToRef}; use crate::{Infos, SetMetaData}; pub struct LWECiphertext { pub(crate) data: VecZnx, pub(crate) k: usize, pub(crate) basek: usize, } impl LWECiphertext> { pub fn alloc(n: usize, basek: usize, k: usize) -> Self { Self { data: VecZnx::new::(n, 1, k.div_ceil(basek)), k: k, basek: basek, } } } impl Infos for LWECiphertext { type Inner = VecZnx; fn n(&self) -> usize{ &self.inner().n-1 } fn inner(&self) -> &Self::Inner { &self.data } fn basek(&self) -> usize { self.basek } fn k(&self) -> usize { self.k } } impl + AsRef<[u8]>> SetMetaData for LWECiphertext { fn set_k(&mut self, k: usize) { self.k = k } fn set_basek(&mut self, basek: usize) { self.basek = basek } } pub trait LWECiphertextToRef { fn to_ref(&self) -> LWECiphertext<&[u8]>; } impl> LWECiphertextToRef for LWECiphertext { fn to_ref(&self) -> LWECiphertext<&[u8]> { LWECiphertext { data: self.data.to_ref(), basek: self.basek, k: self.k, } } } pub trait LWECiphertextToMut { fn to_mut(&mut self) -> LWECiphertext<&mut [u8]>; } impl + AsRef<[u8]>> LWECiphertextToMut for LWECiphertext { fn to_mut(&mut self) -> LWECiphertext<&mut [u8]> { LWECiphertext { data: self.data.to_mut(), basek: self.basek, k: self.k, } } }