poulpy/core/src/glwe_plaintext.rs
core/src/glwe_plaintext.rsRaw
1use backend::{Backend, Module, VecZnx, VecZnxAlloc, VecZnxToMut, VecZnxToRef};
2
3use crate::{
4 elem::{Infos, SetMetaData},
5 glwe_ciphertext::{GLWECiphertext, GLWECiphertextToMut, GLWECiphertextToRef},
6 glwe_ops::GLWEOps,
7 utils::derive_size,
8};
9
10pub struct GLWEPlaintext<C> {
11 pub data: VecZnx<C>,
12 pub basek: usize,
13 pub k: usize,
14}
15
16impl<T> Infos for GLWEPlaintext<T> {
17 type Inner = VecZnx<T>;
18
19 fn inner(&self) -> &Self::Inner {
20 &self.data
21 }
22
23 fn basek(&self) -> usize {
24 self.basek
25 }
26
27 fn k(&self) -> usize {
28 self.k
29 }
30}
31
32impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> SetMetaData for GLWEPlaintext<DataSelf> {
33 fn set_k(&mut self, k: usize) {
34 self.k = k
35 }
36
37 fn set_basek(&mut self, basek: usize) {
38 self.basek = basek
39 }
40}
41
42impl GLWEPlaintext<Vec<u8>> {
43 pub fn alloc<B: Backend>(module: &Module<B>, basek: usize, k: usize) -> Self {
44 Self {
45 data: module.new_vec_znx(1, derive_size(basek, k)),
46 basek: basek,
47 k,
48 }
49 }
50}
51
52impl<D: AsRef<[u8]>> GLWECiphertextToRef for GLWEPlaintext<D> {
53 fn to_ref(&self) -> GLWECiphertext<&[u8]> {
54 GLWECiphertext {
55 data: self.data.to_ref(),
56 basek: self.basek,
57 k: self.k,
58 }
59 }
60}
61
62impl<D: AsMut<[u8]> + AsRef<[u8]>> GLWECiphertextToMut for GLWEPlaintext<D> {
63 fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]> {
64 GLWECiphertext {
65 data: self.data.to_mut(),
66 basek: self.basek,
67 k: self.k,
68 }
69 }
70}
71
72impl<D> GLWEOps for GLWEPlaintext<D>
73where
74 D: AsRef<[u8]> + AsMut<[u8]>,
75 GLWEPlaintext<D>: GLWECiphertextToMut + Infos + SetMetaData,
76{
77}