Skip to content

Commit cce7d9e

Browse files
authored
Merge pull request dimforge#937 from jsmith628/fixed-size-borrow
Implemented Borrow and BorrowMut on fixed size matrices
2 parents c320988 + a7fe7a5 commit cce7d9e

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

src/base/conversion.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#[cfg(all(feature = "alloc", not(feature = "std")))]
22
use alloc::vec::Vec;
33
use simba::scalar::{SubsetOf, SupersetOf};
4+
use std::borrow::{Borrow, BorrowMut};
45
use std::convert::{AsMut, AsRef, From, Into};
56

67
use simba::simd::{PrimitiveSimdValue, SimdValue};
@@ -192,32 +193,47 @@ impl<T: Scalar, const R: usize, const C: usize> From<SMatrix<T, R, C>> for [[T;
192193
}
193194
}
194195

195-
macro_rules! impl_from_into_asref_2D(
196-
($(($NRows: ty, $NCols: ty) => ($SZRows: expr, $SZCols: expr));* $(;)*) => {$(
197-
impl<T: Scalar, S> AsRef<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
196+
macro_rules! impl_from_into_asref_borrow_2D(
197+
198+
//does the impls on one case for either AsRef/AsMut and Borrow/BorrowMut
199+
(
200+
($NRows: ty, $NCols: ty) => ($SZRows: expr, $SZCols: expr);
201+
$Ref:ident.$ref:ident(), $Mut:ident.$mut:ident()
202+
) => {
203+
impl<T: Scalar, S> $Ref<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
198204
where S: ContiguousStorage<T, $NRows, $NCols> {
199205
#[inline]
200-
fn as_ref(&self) -> &[[T; $SZRows]; $SZCols] {
206+
fn $ref(&self) -> &[[T; $SZRows]; $SZCols] {
201207
unsafe {
202208
&*(self.data.ptr() as *const [[T; $SZRows]; $SZCols])
203209
}
204210
}
205211
}
206212

207-
impl<T: Scalar, S> AsMut<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
213+
impl<T: Scalar, S> $Mut<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
208214
where S: ContiguousStorageMut<T, $NRows, $NCols> {
209215
#[inline]
210-
fn as_mut(&mut self) -> &mut [[T; $SZRows]; $SZCols] {
216+
fn $mut(&mut self) -> &mut [[T; $SZRows]; $SZCols] {
211217
unsafe {
212218
&mut *(self.data.ptr_mut() as *mut [[T; $SZRows]; $SZCols])
213219
}
214220
}
215221
}
222+
};
223+
224+
//collects the mappings from typenum pairs to consts
225+
($(($NRows: ty, $NCols: ty) => ($SZRows: expr, $SZCols: expr));* $(;)*) => {$(
226+
impl_from_into_asref_borrow_2D!(
227+
($NRows, $NCols) => ($SZRows, $SZCols); AsRef.as_ref(), AsMut.as_mut()
228+
);
229+
impl_from_into_asref_borrow_2D!(
230+
($NRows, $NCols) => ($SZRows, $SZCols); Borrow.borrow(), BorrowMut.borrow_mut()
231+
);
216232
)*}
217233
);
218234

219235
// Implement for matrices with shape 2x2 .. 6x6.
220-
impl_from_into_asref_2D!(
236+
impl_from_into_asref_borrow_2D!(
221237
(U2, U2) => (2, 2); (U2, U3) => (2, 3); (U2, U4) => (2, 4); (U2, U5) => (2, 5); (U2, U6) => (2, 6);
222238
(U3, U2) => (3, 2); (U3, U3) => (3, 3); (U3, U4) => (3, 4); (U3, U5) => (3, 5); (U3, U6) => (3, 6);
223239
(U4, U2) => (4, 2); (U4, U3) => (4, 3); (U4, U4) => (4, 4); (U4, U5) => (4, 5); (U4, U6) => (4, 6);

0 commit comments

Comments
 (0)