use std::fmt; use backend::hal::layouts::{Data, DataMut, DataRef, VecZnx, VecZnxToMut, VecZnxToRef}; use crate::layouts::{Infos, SetMetaData}; pub struct LWEPlaintext { pub(crate) data: VecZnx, pub(crate) k: usize, pub(crate) basek: usize, } impl LWEPlaintext> { pub fn alloc(basek: usize, k: usize) -> Self { Self { data: VecZnx::alloc(1, 1, k.div_ceil(basek)), k: k, basek: basek, } } } impl fmt::Display for LWEPlaintext { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "LWEPlaintext: basek={} k={}: {}", self.basek(), self.k(), self.data ) } } impl Infos for LWEPlaintext { type Inner = VecZnx; fn inner(&self) -> &Self::Inner { &self.data } fn basek(&self) -> usize { self.basek } fn k(&self) -> usize { self.k } } impl SetMetaData for LWEPlaintext { fn set_k(&mut self, k: usize) { self.k = k } fn set_basek(&mut self, basek: usize) { self.basek = basek } } pub trait LWEPlaintextToRef { #[allow(dead_code)] fn to_ref(&self) -> LWEPlaintext<&[u8]>; } impl LWEPlaintextToRef for LWEPlaintext { fn to_ref(&self) -> LWEPlaintext<&[u8]> { LWEPlaintext { data: self.data.to_ref(), basek: self.basek, k: self.k, } } } pub trait LWEPlaintextToMut { #[allow(dead_code)] fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]>; } impl LWEPlaintextToMut for LWEPlaintext { fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]> { LWEPlaintext { data: self.data.to_mut(), basek: self.basek, k: self.k, } } } impl LWEPlaintext { pub fn data_mut(&mut self) -> &mut VecZnx { &mut self.data } }