poulpy_core/layouts/
lwe_pt.rs1use std::fmt;
2
3use poulpy_hal::layouts::{Data, DataMut, DataRef, Zn, ZnToMut, ZnToRef};
4
5use crate::layouts::{Infos, SetMetaData};
6
7pub struct LWEPlaintext<D: Data> {
8 pub(crate) data: Zn<D>,
9 pub(crate) k: usize,
10 pub(crate) basek: usize,
11}
12
13impl LWEPlaintext<Vec<u8>> {
14 pub fn alloc(basek: usize, k: usize) -> Self {
15 Self {
16 data: Zn::alloc(1, 1, k.div_ceil(basek)),
17 k,
18 basek,
19 }
20 }
21}
22
23impl<D: DataRef> fmt::Display for LWEPlaintext<D> {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 write!(
26 f,
27 "LWEPlaintext: basek={} k={}: {}",
28 self.basek(),
29 self.k(),
30 self.data
31 )
32 }
33}
34
35impl<D: Data> Infos for LWEPlaintext<D> {
36 type Inner = Zn<D>;
37
38 fn inner(&self) -> &Self::Inner {
39 &self.data
40 }
41
42 fn basek(&self) -> usize {
43 self.basek
44 }
45
46 fn k(&self) -> usize {
47 self.k
48 }
49}
50
51impl<D: DataMut> SetMetaData for LWEPlaintext<D> {
52 fn set_k(&mut self, k: usize) {
53 self.k = k
54 }
55
56 fn set_basek(&mut self, basek: usize) {
57 self.basek = basek
58 }
59}
60
61pub trait LWEPlaintextToRef {
62 #[allow(dead_code)]
63 fn to_ref(&self) -> LWEPlaintext<&[u8]>;
64}
65
66impl<D: DataRef> LWEPlaintextToRef for LWEPlaintext<D> {
67 fn to_ref(&self) -> LWEPlaintext<&[u8]> {
68 LWEPlaintext {
69 data: self.data.to_ref(),
70 basek: self.basek,
71 k: self.k,
72 }
73 }
74}
75
76pub trait LWEPlaintextToMut {
77 #[allow(dead_code)]
78 fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]>;
79}
80
81impl<D: DataMut> LWEPlaintextToMut for LWEPlaintext<D> {
82 fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]> {
83 LWEPlaintext {
84 data: self.data.to_mut(),
85 basek: self.basek,
86 k: self.k,
87 }
88 }
89}
90
91impl<D: DataMut> LWEPlaintext<D> {
92 pub fn data_mut(&mut self) -> &mut Zn<D> {
93 &mut self.data
94 }
95}