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