use crate::default::plaintext::CKKSPlaintextDefault;
use anyhow::Result;
use poulpy_core::layouts::{GLWEInfos, GLWEToBackendMut, GLWEToBackendRef, LWEInfos};
use poulpy_hal::{
api::{VecZnxLshBackend, VecZnxLshTmpBytes, VecZnxRshBackend, VecZnxRshTmpBytes},
layouts::{Backend, Module, ScratchArena},
};
use crate::{CKKSInfos, SetCKKSInfos};
pub unsafe trait CKKSPlaintextZnxImpl<BE: Backend>: Backend {
fn ckks_extract_pt_tmp_bytes(module: &Module<BE>) -> usize;
fn ckks_extract_pt<Dst, Src>(module: &Module<BE>, dst: &mut Dst, src: &Src, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
Src: GLWEToBackendRef<BE> + GLWEInfos + LWEInfos + CKKSInfos;
}
unsafe impl<BE: Backend> CKKSPlaintextZnxImpl<BE> for BE
where
BE: poulpy_hal::oep::HalVecZnxImpl<BE>,
Module<BE>: CKKSPlaintextDefault<BE> + VecZnxLshTmpBytes + VecZnxRshTmpBytes + VecZnxLshBackend<BE> + VecZnxRshBackend<BE>,
{
fn ckks_extract_pt_tmp_bytes(module: &Module<BE>) -> usize {
module.ckks_extract_pt_tmp_bytes_default()
}
fn ckks_extract_pt<Dst, Src>(module: &Module<BE>, dst: &mut Dst, src: &Src, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
Src: GLWEToBackendRef<BE> + GLWEInfos + LWEInfos + CKKSInfos,
{
module.ckks_extract_pt_default(dst, src, scratch)
}
}
#[macro_export]
macro_rules! impl_ckks_plaintext_defaults {
($be:ty) => {
impl $crate::default::plaintext::CKKSPlaintextDefault<$be> for ::poulpy_hal::layouts::Module<$be> {}
};
}
pub use crate::impl_ckks_plaintext_defaults;