use crate::{ api::ZnxInfos, layouts::{Backend, DataRef, MatZnx, ScalarZnx, Scratch, ScratchOwned, SvpPPol, VecZnx, VecZnxBig, VecZnxDft, VmpPMat}, }; /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait ScratchOwnedAllocImpl { fn scratch_owned_alloc_impl(size: usize) -> ScratchOwned; } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait ScratchOwnedBorrowImpl { fn scratch_owned_borrow_impl(scratch: &mut ScratchOwned) -> &mut Scratch; } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait ScratchFromBytesImpl { fn scratch_from_bytes_impl(data: &mut [u8]) -> &mut Scratch; } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait ScratchAvailableImpl { fn scratch_available_impl(scratch: &Scratch) -> usize; } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeSliceImpl { fn take_slice_impl(scratch: &mut Scratch, len: usize) -> (&mut [T], &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeScalarZnxImpl { fn take_scalar_znx_impl(scratch: &mut Scratch, n: usize, cols: usize) -> (ScalarZnx<&mut [u8]>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeSvpPPolImpl { fn take_svp_ppol_impl(scratch: &mut Scratch, n: usize, cols: usize) -> (SvpPPol<&mut [u8], B>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVecZnxImpl { fn take_vec_znx_impl(scratch: &mut Scratch, n: usize, cols: usize, size: usize) -> (VecZnx<&mut [u8]>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVecZnxSliceImpl { fn take_vec_znx_slice_impl( scratch: &mut Scratch, len: usize, n: usize, cols: usize, size: usize, ) -> (Vec>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVecZnxBigImpl { fn take_vec_znx_big_impl( scratch: &mut Scratch, n: usize, cols: usize, size: usize, ) -> (VecZnxBig<&mut [u8], B>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVecZnxDftImpl { fn take_vec_znx_dft_impl( scratch: &mut Scratch, n: usize, cols: usize, size: usize, ) -> (VecZnxDft<&mut [u8], B>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVecZnxDftSliceImpl { fn take_vec_znx_dft_slice_impl( scratch: &mut Scratch, len: usize, n: usize, cols: usize, size: usize, ) -> (Vec>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeVmpPMatImpl { fn take_vmp_pmat_impl( scratch: &mut Scratch, n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize, ) -> (VmpPMat<&mut [u8], B>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub unsafe trait TakeMatZnxImpl { fn take_mat_znx_impl( scratch: &mut Scratch, n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize, ) -> (MatZnx<&mut [u8]>, &mut Scratch); } /// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) /// * See TODO for reference code. /// * See TODO for corresponding public API. /// # Safety [crate::doc::backend_safety] for safety contract. pub trait TakeLikeImpl<'a, B: Backend, T> { type Output; fn take_like_impl(scratch: &'a mut Scratch, template: &T) -> (Self::Output, &'a mut Scratch); } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VmpPMat> for B where B: TakeVmpPMatImpl, D: DataRef, { type Output = VmpPMat<&'a mut [u8], B>; fn take_like_impl(scratch: &'a mut Scratch, template: &VmpPMat) -> (Self::Output, &'a mut Scratch) { B::take_vmp_pmat_impl( scratch, template.n(), template.rows(), template.cols_in(), template.cols_out(), template.size(), ) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, MatZnx> for B where B: TakeMatZnxImpl, D: DataRef, { type Output = MatZnx<&'a mut [u8]>; fn take_like_impl(scratch: &'a mut Scratch, template: &MatZnx) -> (Self::Output, &'a mut Scratch) { B::take_mat_znx_impl( scratch, template.n(), template.rows(), template.cols_in(), template.cols_out(), template.size(), ) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxDft> for B where B: TakeVecZnxDftImpl, D: DataRef, { type Output = VecZnxDft<&'a mut [u8], B>; fn take_like_impl(scratch: &'a mut Scratch, template: &VecZnxDft) -> (Self::Output, &'a mut Scratch) { B::take_vec_znx_dft_impl(scratch, template.n(), template.cols(), template.size()) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxBig> for B where B: TakeVecZnxBigImpl, D: DataRef, { type Output = VecZnxBig<&'a mut [u8], B>; fn take_like_impl(scratch: &'a mut Scratch, template: &VecZnxBig) -> (Self::Output, &'a mut Scratch) { B::take_vec_znx_big_impl(scratch, template.n(), template.cols(), template.size()) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, SvpPPol> for B where B: TakeSvpPPolImpl, D: DataRef, { type Output = SvpPPol<&'a mut [u8], B>; fn take_like_impl(scratch: &'a mut Scratch, template: &SvpPPol) -> (Self::Output, &'a mut Scratch) { B::take_svp_ppol_impl(scratch, template.n(), template.cols()) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnx> for B where B: TakeVecZnxImpl, D: DataRef, { type Output = VecZnx<&'a mut [u8]>; fn take_like_impl(scratch: &'a mut Scratch, template: &VecZnx) -> (Self::Output, &'a mut Scratch) { B::take_vec_znx_impl(scratch, template.n(), template.cols(), template.size()) } } impl<'a, B: Backend, D> TakeLikeImpl<'a, B, ScalarZnx> for B where B: TakeScalarZnxImpl, D: DataRef, { type Output = ScalarZnx<&'a mut [u8]>; fn take_like_impl(scratch: &'a mut Scratch, template: &ScalarZnx) -> (Self::Output, &'a mut Scratch) { B::take_scalar_znx_impl(scratch, template.n(), template.cols()) } }