poulpy_core/layouts/
lwe_pt.rs

1use 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}