Skip to main content

poulpy_hal/layouts/
scratch_views.rs

1use std::ops::{Deref, DerefMut};
2
3use crate::layouts::{
4    Backend, CnvPVecL, CnvPVecLBackendMut, CnvPVecLBackendRef, CnvPVecLReborrowBackendMut, CnvPVecLReborrowBackendRef,
5    CnvPVecLToBackendMut, CnvPVecLToBackendRef, CnvPVecR, CnvPVecRBackendMut, CnvPVecRBackendRef, CnvPVecRReborrowBackendMut,
6    CnvPVecRReborrowBackendRef, CnvPVecRToBackendMut, CnvPVecRToBackendRef, MatZnx, MatZnxBackendMut, MatZnxBackendRef,
7    MatZnxToBackendMut, MatZnxToBackendRef, ScalarZnx, ScalarZnxBackendMut, ScalarZnxBackendRef, ScalarZnxToBackendMut,
8    ScalarZnxToBackendRef, SvpPPol, SvpPPolBackendMut, SvpPPolBackendRef, SvpPPolReborrowBackendMut, SvpPPolReborrowBackendRef,
9    SvpPPolToBackendMut, SvpPPolToBackendRef, VecZnx, VecZnxBackendMut, VecZnxBackendRef, VecZnxBig, VecZnxBigBackendMut,
10    VecZnxBigBackendRef, VecZnxBigReborrowBackendMut, VecZnxBigReborrowBackendRef, VecZnxBigToBackendMut, VecZnxBigToBackendRef,
11    VecZnxDft, VecZnxDftBackendMut, VecZnxDftBackendRef, VecZnxDftReborrowBackendMut, VecZnxDftReborrowBackendRef,
12    VecZnxDftToBackendMut, VecZnxDftToBackendRef, VecZnxReborrowBackendMut, VecZnxReborrowBackendRef, VecZnxToBackendMut,
13    VecZnxToBackendRef, VmpPMat, VmpPMatBackendMut, VmpPMatBackendRef, VmpPMatReborrowBackendMut, VmpPMatReborrowBackendRef,
14    VmpPMatToBackendMut, VmpPMatToBackendRef, ZnxInfos, mat_znx_backend_mut_from_mut, mat_znx_backend_ref_from_mut,
15};
16
17macro_rules! view_wrapper {
18    ($name:ident, $inner:ty) => {
19        pub struct $name<'a, B: Backend + 'a> {
20            inner: $inner,
21        }
22
23        impl<'a, B: Backend + 'a> $name<'a, B> {
24            pub fn from_inner(inner: $inner) -> Self {
25                Self { inner }
26            }
27
28            pub fn into_inner(self) -> $inner {
29                self.inner
30            }
31        }
32
33        impl<'a, B: Backend + 'a> Deref for $name<'a, B> {
34            type Target = $inner;
35
36            fn deref(&self) -> &Self::Target {
37                &self.inner
38            }
39        }
40
41        impl<'a, B: Backend + 'a> DerefMut for $name<'a, B> {
42            fn deref_mut(&mut self) -> &mut Self::Target {
43                &mut self.inner
44            }
45        }
46
47        impl<'a, B: Backend + 'a> ZnxInfos for $name<'a, B> {
48            fn cols(&self) -> usize {
49                self.inner.cols()
50            }
51
52            fn rows(&self) -> usize {
53                self.inner.rows()
54            }
55
56            fn n(&self) -> usize {
57                self.inner.n()
58            }
59
60            fn size(&self) -> usize {
61                self.inner.size()
62            }
63
64            fn poly_count(&self) -> usize {
65                self.inner.poly_count()
66            }
67        }
68    };
69}
70
71view_wrapper!(CnvPVecLViewMut, CnvPVecL<B::BufMut<'a>, B>);
72view_wrapper!(CnvPVecRViewMut, CnvPVecR<B::BufMut<'a>, B>);
73view_wrapper!(MatZnxViewMut, MatZnx<B::BufMut<'a>>);
74view_wrapper!(ScalarZnxViewMut, ScalarZnx<B::BufMut<'a>>);
75view_wrapper!(SvpPPolViewMut, SvpPPol<B::BufMut<'a>, B>);
76view_wrapper!(VecZnxViewMut, VecZnx<B::BufMut<'a>>);
77view_wrapper!(VecZnxBigViewMut, VecZnxBig<B::BufMut<'a>, B>);
78view_wrapper!(VecZnxDftViewMut, VecZnxDft<B::BufMut<'a>, B>);
79view_wrapper!(VmpPMatViewMut, VmpPMat<B::BufMut<'a>, B>);
80
81impl<'a, B: Backend + 'a> CnvPVecLToBackendRef<B> for CnvPVecLViewMut<'a, B> {
82    fn to_backend_ref(&self) -> CnvPVecLBackendRef<'_, B> {
83        self.inner.reborrow_backend_ref()
84    }
85}
86
87impl<'a, B: Backend + 'a> CnvPVecLToBackendMut<B> for CnvPVecLViewMut<'a, B> {
88    fn to_backend_mut(&mut self) -> CnvPVecLBackendMut<'_, B> {
89        self.inner.reborrow_backend_mut()
90    }
91}
92
93impl<'a, B: Backend + 'a> CnvPVecRToBackendRef<B> for CnvPVecRViewMut<'a, B> {
94    fn to_backend_ref(&self) -> CnvPVecRBackendRef<'_, B> {
95        self.inner.reborrow_backend_ref()
96    }
97}
98
99impl<'a, B: Backend + 'a> CnvPVecRToBackendMut<B> for CnvPVecRViewMut<'a, B> {
100    fn to_backend_mut(&mut self) -> CnvPVecRBackendMut<'_, B> {
101        self.inner.reborrow_backend_mut()
102    }
103}
104
105impl<'a, B: Backend + 'a> MatZnxToBackendRef<B> for MatZnxViewMut<'a, B> {
106    fn to_backend_ref(&self) -> MatZnxBackendRef<'_, B> {
107        mat_znx_backend_ref_from_mut::<B>(&self.inner)
108    }
109}
110
111impl<'a, B: Backend + 'a> MatZnxToBackendMut<B> for MatZnxViewMut<'a, B> {
112    fn to_backend_mut(&mut self) -> MatZnxBackendMut<'_, B> {
113        mat_znx_backend_mut_from_mut::<B>(&mut self.inner)
114    }
115}
116
117impl<'a, B: Backend + 'a> ScalarZnxToBackendRef<B> for ScalarZnxViewMut<'a, B> {
118    fn to_backend_ref(&self) -> ScalarZnxBackendRef<'_, B> {
119        ScalarZnx::from_data(B::view_ref_mut(&self.inner.data), self.inner.n(), self.inner.cols())
120    }
121}
122
123impl<'a, B: Backend + 'a> ScalarZnxToBackendMut<B> for ScalarZnxViewMut<'a, B> {
124    fn to_backend_mut(&mut self) -> ScalarZnxBackendMut<'_, B> {
125        let n = self.inner.n();
126        let cols = self.inner.cols();
127        ScalarZnx::from_data(B::view_mut_ref(&mut self.inner.data), n, cols)
128    }
129}
130
131impl<'a, B: Backend + 'a> SvpPPolToBackendRef<B> for SvpPPolViewMut<'a, B> {
132    fn to_backend_ref(&self) -> SvpPPolBackendRef<'_, B> {
133        self.inner.reborrow_backend_ref()
134    }
135}
136
137impl<'a, B: Backend + 'a> SvpPPolToBackendMut<B> for SvpPPolViewMut<'a, B> {
138    fn to_backend_mut(&mut self) -> SvpPPolBackendMut<'_, B> {
139        self.inner.reborrow_backend_mut()
140    }
141}
142
143impl<'a, B: Backend + 'a> VecZnxToBackendRef<B> for VecZnxViewMut<'a, B> {
144    fn to_backend_ref(&self) -> VecZnxBackendRef<'_, B> {
145        <VecZnx<B::BufMut<'a>> as VecZnxReborrowBackendRef<B>>::reborrow_backend_ref(&self.inner)
146    }
147}
148
149impl<'a, B: Backend + 'a> VecZnxToBackendMut<B> for VecZnxViewMut<'a, B> {
150    fn to_backend_mut(&mut self) -> VecZnxBackendMut<'_, B> {
151        <VecZnx<B::BufMut<'a>> as VecZnxReborrowBackendMut<B>>::reborrow_backend_mut(&mut self.inner)
152    }
153}
154
155impl<'a, B: Backend + 'a> VecZnxBigToBackendRef<B> for VecZnxBigViewMut<'a, B> {
156    fn to_backend_ref(&self) -> VecZnxBigBackendRef<'_, B> {
157        self.inner.reborrow_backend_ref()
158    }
159}
160
161impl<'a, B: Backend + 'a> VecZnxBigToBackendMut<B> for VecZnxBigViewMut<'a, B> {
162    fn to_backend_mut(&mut self) -> VecZnxBigBackendMut<'_, B> {
163        self.inner.reborrow_backend_mut()
164    }
165}
166
167impl<'a, B: Backend + 'a> VecZnxDftToBackendRef<B> for VecZnxDftViewMut<'a, B> {
168    fn to_backend_ref(&self) -> VecZnxDftBackendRef<'_, B> {
169        self.inner.reborrow_backend_ref()
170    }
171}
172
173impl<'a, B: Backend + 'a> VecZnxDftToBackendMut<B> for VecZnxDftViewMut<'a, B> {
174    fn to_backend_mut(&mut self) -> VecZnxDftBackendMut<'_, B> {
175        self.inner.reborrow_backend_mut()
176    }
177}
178
179impl<'a, B: Backend + 'a> VmpPMatToBackendRef<B> for VmpPMatViewMut<'a, B> {
180    fn to_backend_ref(&self) -> VmpPMatBackendRef<'_, B> {
181        self.inner.reborrow_backend_ref()
182    }
183}
184
185impl<'a, B: Backend + 'a> VmpPMatToBackendMut<B> for VmpPMatViewMut<'a, B> {
186    fn to_backend_mut(&mut self) -> VmpPMatBackendMut<'_, B> {
187        self.inner.reborrow_backend_mut()
188    }
189}