Coverage Report

Created: 2026-07-30 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/nalgebra-0.35.0/src/base/conversion.rs
Line
Count
Source
1
#[cfg(all(feature = "alloc", not(feature = "std")))]
2
use alloc::vec::Vec;
3
use simba::scalar::{SubsetOf, SupersetOf};
4
use std::borrow::{Borrow, BorrowMut};
5
use std::convert::{AsMut, AsRef, From, Into};
6
7
use simba::simd::{PrimitiveSimdValue, SimdValue};
8
9
use crate::base::allocator::{Allocator, SameShapeAllocator};
10
use crate::base::constraint::{SameNumberOfColumns, SameNumberOfRows, ShapeConstraint};
11
use crate::base::dimension::{
12
    Const, Dim, U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16,
13
};
14
#[cfg(any(feature = "std", feature = "alloc"))]
15
use crate::base::dimension::{DimName, Dyn};
16
use crate::base::iter::{MatrixIter, MatrixIterMut};
17
use crate::base::storage::{IsContiguous, RawStorage, RawStorageMut};
18
use crate::base::{
19
    ArrayStorage, DVectorView, DVectorViewMut, DefaultAllocator, Matrix, MatrixView, MatrixViewMut,
20
    OMatrix, Scalar,
21
};
22
#[cfg(any(feature = "std", feature = "alloc"))]
23
use crate::base::{DVector, RowDVector, VecStorage};
24
use crate::base::{ViewStorage, ViewStorageMut};
25
use crate::constraint::DimEq;
26
use crate::{IsNotStaticOne, RowSVector, SMatrix, SVector, VectorView, VectorViewMut};
27
use std::mem::MaybeUninit;
28
29
// TODO: too bad this won't work for slice conversions.
30
impl<T1, T2, R1, C1, R2, C2> SubsetOf<OMatrix<T2, R2, C2>> for OMatrix<T1, R1, C1>
31
where
32
    R1: Dim,
33
    C1: Dim,
34
    R2: Dim,
35
    C2: Dim,
36
    T1: Scalar,
37
    T2: Scalar + SupersetOf<T1>,
38
    DefaultAllocator: Allocator<R2, C2> + Allocator<R1, C1> + SameShapeAllocator<R1, C1, R2, C2>,
39
    ShapeConstraint: SameNumberOfRows<R1, R2> + SameNumberOfColumns<C1, C2>,
40
{
41
    #[inline]
42
    fn to_superset(&self) -> OMatrix<T2, R2, C2> {
43
        let (nrows, ncols) = self.shape();
44
        let nrows2 = R2::from_usize(nrows);
45
        let ncols2 = C2::from_usize(ncols);
46
        let mut res = Matrix::uninit(nrows2, ncols2);
47
48
        for i in 0..nrows {
49
            for j in 0..ncols {
50
                // Safety: all indices are in range.
51
                unsafe {
52
                    *res.get_unchecked_mut((i, j)) =
53
                        MaybeUninit::new(T2::from_subset(self.get_unchecked((i, j))));
54
                }
55
            }
56
        }
57
58
        // Safety: res is now fully initialized.
59
        unsafe { res.assume_init() }
60
    }
61
62
    #[inline]
63
    fn is_in_subset(m: &OMatrix<T2, R2, C2>) -> bool {
64
        m.iter().all(|e| e.is_in_subset())
65
    }
66
67
    #[inline]
68
    fn from_superset_unchecked(m: &OMatrix<T2, R2, C2>) -> Self {
69
        let (nrows2, ncols2) = m.shape();
70
        let nrows = R1::from_usize(nrows2);
71
        let ncols = C1::from_usize(ncols2);
72
        let mut res = Matrix::uninit(nrows, ncols);
73
74
        for i in 0..nrows2 {
75
            for j in 0..ncols2 {
76
                // Safety: all indices are in range.
77
                unsafe {
78
                    *res.get_unchecked_mut((i, j)) =
79
                        MaybeUninit::new(m.get_unchecked((i, j)).to_subset_unchecked())
80
                }
81
            }
82
        }
83
84
        unsafe { res.assume_init() }
85
    }
86
}
87
88
impl<'a, T: Scalar, R: Dim, C: Dim, S: RawStorage<T, R, C>> IntoIterator
89
    for &'a Matrix<T, R, C, S>
90
{
91
    type Item = &'a T;
92
    type IntoIter = MatrixIter<'a, T, R, C, S>;
93
94
    #[inline]
95
    fn into_iter(self) -> Self::IntoIter {
96
        self.iter()
97
    }
98
}
99
100
impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> IntoIterator
101
    for Matrix<T, R, C, ViewStorage<'a, T, R, C, RStride, CStride>>
102
{
103
    type Item = &'a T;
104
    type IntoIter = MatrixIter<'a, T, R, C, ViewStorage<'a, T, R, C, RStride, CStride>>;
105
106
    #[inline]
107
    fn into_iter(self) -> Self::IntoIter {
108
        MatrixIter::new_owned(self.data)
109
    }
110
}
111
112
impl<'a, T: Scalar, R: Dim, C: Dim, S: RawStorageMut<T, R, C>> IntoIterator
113
    for &'a mut Matrix<T, R, C, S>
114
{
115
    type Item = &'a mut T;
116
    type IntoIter = MatrixIterMut<'a, T, R, C, S>;
117
118
    #[inline]
119
    fn into_iter(self) -> Self::IntoIter {
120
        self.iter_mut()
121
    }
122
}
123
124
impl<'a, T: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> IntoIterator
125
    for Matrix<T, R, C, ViewStorageMut<'a, T, R, C, RStride, CStride>>
126
{
127
    type Item = &'a mut T;
128
    type IntoIter = MatrixIterMut<'a, T, R, C, ViewStorageMut<'a, T, R, C, RStride, CStride>>;
129
130
    #[inline]
131
    fn into_iter(self) -> Self::IntoIter {
132
        MatrixIterMut::new_owned_mut(self.data)
133
    }
134
}
135
136
impl<T: Scalar, const D: usize> From<[T; D]> for SVector<T, D> {
137
    #[inline]
138
    fn from(arr: [T; D]) -> Self {
139
        unsafe { Self::from_data_statically_unchecked(ArrayStorage([arr; 1])) }
140
    }
141
}
142
143
impl<T: Scalar, const D: usize> From<SVector<T, D>> for [T; D] {
144
    #[inline]
145
    fn from(vec: SVector<T, D>) -> Self {
146
        // TODO: unfortunately, we must clone because we can move out of an array.
147
        vec.data.0[0].clone()
148
    }
149
}
150
151
impl<'a, T: Scalar, RStride: Dim, CStride: Dim, const D: usize>
152
    From<VectorView<'a, T, Const<D>, RStride, CStride>> for [T; D]
153
{
154
    #[inline]
155
    fn from(vec: VectorView<'a, T, Const<D>, RStride, CStride>) -> Self {
156
        vec.into_owned().into()
157
    }
158
}
159
160
impl<'a, T: Scalar, RStride: Dim, CStride: Dim, const D: usize>
161
    From<VectorViewMut<'a, T, Const<D>, RStride, CStride>> for [T; D]
162
{
163
    #[inline]
164
    fn from(vec: VectorViewMut<'a, T, Const<D>, RStride, CStride>) -> Self {
165
        vec.into_owned().into()
166
    }
167
}
168
169
impl<T: Scalar, const D: usize> From<[T; D]> for RowSVector<T, D>
170
where
171
    Const<D>: IsNotStaticOne,
172
{
173
    #[inline]
174
    fn from(arr: [T; D]) -> Self {
175
        SVector::<T, D>::from(arr).transpose()
176
    }
177
}
178
179
impl<T: Scalar, const D: usize> From<RowSVector<T, D>> for [T; D]
180
where
181
    Const<D>: IsNotStaticOne,
182
{
183
    #[inline]
184
    fn from(vec: RowSVector<T, D>) -> [T; D] {
185
        vec.transpose().into()
186
    }
187
}
188
189
macro_rules! impl_from_into_asref_1D(
190
    ($(($NRows: ident, $NCols: ident) => $SZ: expr_2021);* $(;)*) => {$(
191
        impl<T, S> AsRef<[T; $SZ]> for Matrix<T, $NRows, $NCols, S>
192
        where T: Scalar,
193
              S: RawStorage<T, $NRows, $NCols> + IsContiguous {
194
            #[inline]
195
            fn as_ref(&self) -> &[T; $SZ] {
196
                // Safety: this is OK thanks to the IsContiguous trait.
197
                unsafe {
198
                    &*(self.data.ptr() as *const [T; $SZ])
199
                }
200
            }
201
        }
202
203
        impl<T, S> AsMut<[T; $SZ]> for Matrix<T, $NRows, $NCols, S>
204
        where T: Scalar,
205
              S: RawStorageMut<T, $NRows, $NCols> + IsContiguous {
206
            #[inline]
207
            fn as_mut(&mut self) -> &mut [T; $SZ] {
208
                // Safety: this is OK thanks to the IsContiguous trait.
209
                unsafe {
210
                    &mut *(self.data.ptr_mut() as *mut [T; $SZ])
211
                }
212
            }
213
        }
214
    )*}
215
);
216
217
// Implement for vectors of dimension 1 .. 16.
218
impl_from_into_asref_1D!(
219
    // Row vectors.
220
    (U1, U1 ) => 1;  (U1, U2 ) => 2;  (U1, U3 ) => 3;  (U1, U4 ) => 4;
221
    (U1, U5 ) => 5;  (U1, U6 ) => 6;  (U1, U7 ) => 7;  (U1, U8 ) => 8;
222
    (U1, U9 ) => 9;  (U1, U10) => 10; (U1, U11) => 11; (U1, U12) => 12;
223
    (U1, U13) => 13; (U1, U14) => 14; (U1, U15) => 15; (U1, U16) => 16;
224
225
    // Column vectors.
226
                     (U2 , U1) => 2;  (U3 , U1) => 3;  (U4 , U1) => 4;
227
    (U5 , U1) => 5;  (U6 , U1) => 6;  (U7 , U1) => 7;  (U8 , U1) => 8;
228
    (U9 , U1) => 9;  (U10, U1) => 10; (U11, U1) => 11; (U12, U1) => 12;
229
    (U13, U1) => 13; (U14, U1) => 14; (U15, U1) => 15; (U16, U1) => 16;
230
);
231
232
impl<T: Scalar, const R: usize, const C: usize> From<[[T; R]; C]> for SMatrix<T, R, C> {
233
    #[inline]
234
621
    fn from(arr: [[T; R]; C]) -> Self {
235
621
        unsafe { Self::from_data_statically_unchecked(ArrayStorage(arr)) }
236
621
    }
237
}
238
239
impl<T: Scalar, const R: usize, const C: usize> From<SMatrix<T, R, C>> for [[T; R]; C] {
240
    #[inline]
241
    fn from(mat: SMatrix<T, R, C>) -> Self {
242
        mat.data.0
243
    }
244
}
245
246
impl<'a, T: Scalar, RStride: Dim, CStride: Dim, const R: usize, const C: usize>
247
    From<MatrixView<'a, T, Const<R>, Const<C>, RStride, CStride>> for [[T; R]; C]
248
{
249
    #[inline]
250
    fn from(mat: MatrixView<'a, T, Const<R>, Const<C>, RStride, CStride>) -> Self {
251
        mat.into_owned().into()
252
    }
253
}
254
255
impl<'a, T: Scalar, RStride: Dim, CStride: Dim, const R: usize, const C: usize>
256
    From<MatrixViewMut<'a, T, Const<R>, Const<C>, RStride, CStride>> for [[T; R]; C]
257
{
258
    #[inline]
259
    fn from(mat: MatrixViewMut<'a, T, Const<R>, Const<C>, RStride, CStride>) -> Self {
260
        mat.into_owned().into()
261
    }
262
}
263
264
macro_rules! impl_from_into_asref_borrow_2D(
265
266
    //does the impls on one case for either AsRef/AsMut and Borrow/BorrowMut
267
    (
268
        ($NRows: ty, $NCols: ty) => ($SZRows: expr_2021, $SZCols: expr_2021);
269
        $Ref:ident.$ref:ident(), $Mut:ident.$mut:ident()
270
    ) => {
271
        impl<T: Scalar, S> $Ref<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
272
        where S: RawStorage<T, $NRows, $NCols> + IsContiguous {
273
            #[inline]
274
            fn $ref(&self) -> &[[T; $SZRows]; $SZCols] {
275
                // Safety: OK thanks to the IsContiguous trait.
276
                unsafe {
277
                    &*(self.data.ptr() as *const [[T; $SZRows]; $SZCols])
278
                }
279
            }
280
        }
281
282
        impl<T: Scalar, S> $Mut<[[T; $SZRows]; $SZCols]> for Matrix<T, $NRows, $NCols, S>
283
        where S: RawStorageMut<T, $NRows, $NCols> + IsContiguous {
284
            #[inline]
285
            fn $mut(&mut self) -> &mut [[T; $SZRows]; $SZCols] {
286
                // Safety: OK thanks to the IsContiguous trait.
287
                unsafe {
288
                    &mut *(self.data.ptr_mut() as *mut [[T; $SZRows]; $SZCols])
289
                }
290
            }
291
        }
292
    };
293
294
    //collects the mappings from typenum pairs to consts
295
    ($(($NRows: ty, $NCols: ty) => ($SZRows: expr_2021, $SZCols: expr_2021));* $(;)*) => {$(
296
        impl_from_into_asref_borrow_2D!(
297
            ($NRows, $NCols) => ($SZRows, $SZCols); AsRef.as_ref(), AsMut.as_mut()
298
        );
299
        impl_from_into_asref_borrow_2D!(
300
            ($NRows, $NCols) => ($SZRows, $SZCols); Borrow.borrow(), BorrowMut.borrow_mut()
301
        );
302
    )*}
303
);
304
305
// Implement for matrices with shape 2x2 .. 6x6.
306
impl_from_into_asref_borrow_2D!(
307
    (U2, U2) => (2, 2); (U2, U3) => (2, 3); (U2, U4) => (2, 4); (U2, U5) => (2, 5); (U2, U6) => (2, 6);
308
    (U3, U2) => (3, 2); (U3, U3) => (3, 3); (U3, U4) => (3, 4); (U3, U5) => (3, 5); (U3, U6) => (3, 6);
309
    (U4, U2) => (4, 2); (U4, U3) => (4, 3); (U4, U4) => (4, 4); (U4, U5) => (4, 5); (U4, U6) => (4, 6);
310
    (U5, U2) => (5, 2); (U5, U3) => (5, 3); (U5, U4) => (5, 4); (U5, U5) => (5, 5); (U5, U6) => (5, 6);
311
    (U6, U2) => (6, 2); (U6, U3) => (6, 3); (U6, U4) => (6, 4); (U6, U5) => (6, 5); (U6, U6) => (6, 6);
312
);
313
314
impl<'a, T, RStride, CStride, const R: usize, const C: usize>
315
    From<MatrixView<'a, T, Const<R>, Const<C>, RStride, CStride>>
316
    for Matrix<T, Const<R>, Const<C>, ArrayStorage<T, R, C>>
317
where
318
    T: Scalar,
319
    RStride: Dim,
320
    CStride: Dim,
321
{
322
0
    fn from(matrix_view: MatrixView<'a, T, Const<R>, Const<C>, RStride, CStride>) -> Self {
323
0
        matrix_view.into_owned()
324
0
    }
325
}
326
327
#[cfg(any(feature = "std", feature = "alloc"))]
328
impl<'a, T, C, RStride, CStride> From<MatrixView<'a, T, Dyn, C, RStride, CStride>>
329
    for Matrix<T, Dyn, C, VecStorage<T, Dyn, C>>
330
where
331
    T: Scalar,
332
    C: Dim,
333
    RStride: Dim,
334
    CStride: Dim,
335
{
336
    fn from(matrix_view: MatrixView<'a, T, Dyn, C, RStride, CStride>) -> Self {
337
        matrix_view.into_owned()
338
    }
339
}
340
341
#[cfg(any(feature = "std", feature = "alloc"))]
342
impl<'a, T, R, RStride, CStride> From<MatrixView<'a, T, R, Dyn, RStride, CStride>>
343
    for Matrix<T, R, Dyn, VecStorage<T, R, Dyn>>
344
where
345
    T: Scalar,
346
    R: DimName,
347
    RStride: Dim,
348
    CStride: Dim,
349
{
350
    fn from(matrix_view: MatrixView<'a, T, R, Dyn, RStride, CStride>) -> Self {
351
        matrix_view.into_owned()
352
    }
353
}
354
355
impl<'a, T, RStride, CStride, const R: usize, const C: usize>
356
    From<MatrixViewMut<'a, T, Const<R>, Const<C>, RStride, CStride>>
357
    for Matrix<T, Const<R>, Const<C>, ArrayStorage<T, R, C>>
358
where
359
    T: Scalar,
360
    RStride: Dim,
361
    CStride: Dim,
362
{
363
    fn from(matrix_view: MatrixViewMut<'a, T, Const<R>, Const<C>, RStride, CStride>) -> Self {
364
        matrix_view.into_owned()
365
    }
366
}
367
368
#[cfg(any(feature = "std", feature = "alloc"))]
369
impl<'a, T, C, RStride, CStride> From<MatrixViewMut<'a, T, Dyn, C, RStride, CStride>>
370
    for Matrix<T, Dyn, C, VecStorage<T, Dyn, C>>
371
where
372
    T: Scalar,
373
    C: Dim,
374
    RStride: Dim,
375
    CStride: Dim,
376
{
377
    fn from(matrix_view: MatrixViewMut<'a, T, Dyn, C, RStride, CStride>) -> Self {
378
        matrix_view.into_owned()
379
    }
380
}
381
382
#[cfg(any(feature = "std", feature = "alloc"))]
383
impl<'a, T, R, RStride, CStride> From<MatrixViewMut<'a, T, R, Dyn, RStride, CStride>>
384
    for Matrix<T, R, Dyn, VecStorage<T, R, Dyn>>
385
where
386
    T: Scalar,
387
    R: DimName,
388
    RStride: Dim,
389
    CStride: Dim,
390
{
391
    fn from(matrix_view: MatrixViewMut<'a, T, R, Dyn, RStride, CStride>) -> Self {
392
        matrix_view.into_owned()
393
    }
394
}
395
396
impl<'a, T, R, C, RView, CView, RStride, CStride, S> From<&'a Matrix<T, R, C, S>>
397
    for MatrixView<'a, T, RView, CView, RStride, CStride>
398
where
399
    R: Dim,
400
    C: Dim,
401
    RView: Dim,
402
    CView: Dim,
403
    RStride: Dim,
404
    CStride: Dim,
405
    S: RawStorage<T, R, C>,
406
    ShapeConstraint:
407
        DimEq<R, RView> + DimEq<C, CView> + DimEq<RStride, S::RStride> + DimEq<CStride, S::CStride>,
408
{
409
    fn from(m: &'a Matrix<T, R, C, S>) -> Self {
410
        let (row, col) = m.shape_generic();
411
        let rows_result = RView::from_usize(row.value());
412
        let cols_result = CView::from_usize(col.value());
413
414
        let (rstride, cstride) = m.strides();
415
416
        let rstride_result = RStride::from_usize(rstride);
417
        let cstride_result = CStride::from_usize(cstride);
418
419
        unsafe {
420
            let data = ViewStorage::from_raw_parts(
421
                m.data.ptr(),
422
                (rows_result, cols_result),
423
                (rstride_result, cstride_result),
424
            );
425
            Matrix::from_data_statically_unchecked(data)
426
        }
427
    }
428
}
429
430
impl<'a, T, R, C, RView, CView, RStride, CStride, S> From<&'a mut Matrix<T, R, C, S>>
431
    for MatrixView<'a, T, RView, CView, RStride, CStride>
432
where
433
    R: Dim,
434
    C: Dim,
435
    RView: Dim,
436
    CView: Dim,
437
    RStride: Dim,
438
    CStride: Dim,
439
    S: RawStorage<T, R, C>,
440
    ShapeConstraint:
441
        DimEq<R, RView> + DimEq<C, CView> + DimEq<RStride, S::RStride> + DimEq<CStride, S::CStride>,
442
{
443
    fn from(m: &'a mut Matrix<T, R, C, S>) -> Self {
444
        let (row, col) = m.shape_generic();
445
        let rows_result = RView::from_usize(row.value());
446
        let cols_result = CView::from_usize(col.value());
447
448
        let (rstride, cstride) = m.strides();
449
450
        let rstride_result = RStride::from_usize(rstride);
451
        let cstride_result = CStride::from_usize(cstride);
452
453
        unsafe {
454
            let data = ViewStorage::from_raw_parts(
455
                m.data.ptr(),
456
                (rows_result, cols_result),
457
                (rstride_result, cstride_result),
458
            );
459
            Matrix::from_data_statically_unchecked(data)
460
        }
461
    }
462
}
463
464
impl<'a, T, R, C, RView, CView, RStride, CStride, S> From<&'a mut Matrix<T, R, C, S>>
465
    for MatrixViewMut<'a, T, RView, CView, RStride, CStride>
466
where
467
    R: Dim,
468
    C: Dim,
469
    RView: Dim,
470
    CView: Dim,
471
    RStride: Dim,
472
    CStride: Dim,
473
    S: RawStorageMut<T, R, C>,
474
    ShapeConstraint:
475
        DimEq<R, RView> + DimEq<C, CView> + DimEq<RStride, S::RStride> + DimEq<CStride, S::CStride>,
476
{
477
    fn from(m: &'a mut Matrix<T, R, C, S>) -> Self {
478
        let (row, col) = m.shape_generic();
479
        let rows_result = RView::from_usize(row.value());
480
        let cols_result = CView::from_usize(col.value());
481
482
        let (rstride, cstride) = m.strides();
483
484
        let rstride_result = RStride::from_usize(rstride);
485
        let cstride_result = CStride::from_usize(cstride);
486
487
        unsafe {
488
            let data = ViewStorageMut::from_raw_parts(
489
                m.data.ptr_mut(),
490
                (rows_result, cols_result),
491
                (rstride_result, cstride_result),
492
            );
493
            Matrix::from_data_statically_unchecked(data)
494
        }
495
    }
496
}
497
498
#[cfg(any(feature = "std", feature = "alloc"))]
499
impl<T: Scalar> From<Vec<T>> for DVector<T> {
500
    #[inline]
501
    fn from(vec: Vec<T>) -> Self {
502
        Self::from_vec(vec)
503
    }
504
}
505
506
#[cfg(any(feature = "std", feature = "alloc"))]
507
impl<T: Scalar> From<Vec<T>> for RowDVector<T> {
508
    #[inline]
509
    fn from(vec: Vec<T>) -> Self {
510
        Self::from_vec(vec)
511
    }
512
}
513
514
impl<'a, T: Scalar + Copy, R: Dim, C: Dim, S: RawStorage<T, R, C> + IsContiguous>
515
    From<&'a Matrix<T, R, C, S>> for &'a [T]
516
{
517
    #[inline]
518
    fn from(matrix: &'a Matrix<T, R, C, S>) -> Self {
519
        matrix.as_slice()
520
    }
521
}
522
523
impl<'a, T: Scalar + Copy, R: Dim, C: Dim, S: RawStorageMut<T, R, C> + IsContiguous>
524
    From<&'a mut Matrix<T, R, C, S>> for &'a mut [T]
525
{
526
    #[inline]
527
    fn from(matrix: &'a mut Matrix<T, R, C, S>) -> Self {
528
        matrix.as_mut_slice()
529
    }
530
}
531
532
impl<'a, T: Scalar + Copy> From<&'a [T]> for DVectorView<'a, T> {
533
    #[inline]
534
    fn from(slice: &'a [T]) -> Self {
535
        Self::from_slice(slice, slice.len())
536
    }
537
}
538
539
impl<'a, T: Scalar> From<DVectorView<'a, T>> for &'a [T] {
540
    fn from(vec: DVectorView<'a, T>) -> &'a [T] {
541
        vec.data.into_slice()
542
    }
543
}
544
545
impl<'a, T: Scalar + Copy> From<&'a mut [T]> for DVectorViewMut<'a, T> {
546
    #[inline]
547
    fn from(slice: &'a mut [T]) -> Self {
548
        Self::from_slice(slice, slice.len())
549
    }
550
}
551
552
impl<'a, T: Scalar> From<DVectorViewMut<'a, T>> for &'a mut [T] {
553
    fn from(vec: DVectorViewMut<'a, T>) -> &'a mut [T] {
554
        vec.data.into_slice_mut()
555
    }
556
}
557
558
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 2]>
559
    for OMatrix<T, R, C>
560
where
561
    T: From<[<T as SimdValue>::Element; 2]>,
562
    T::Element: Scalar + SimdValue,
563
    DefaultAllocator: Allocator<R, C>,
564
{
565
    #[inline]
566
    fn from(arr: [OMatrix<T::Element, R, C>; 2]) -> Self {
567
        let (nrows, ncols) = arr[0].shape_generic();
568
569
        Self::from_fn_generic(nrows, ncols, |i, j| {
570
            [arr[0][(i, j)].clone(), arr[1][(i, j)].clone()].into()
571
        })
572
    }
573
}
574
575
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 4]>
576
    for OMatrix<T, R, C>
577
where
578
    T: From<[<T as SimdValue>::Element; 4]>,
579
    T::Element: Scalar + SimdValue,
580
    DefaultAllocator: Allocator<R, C>,
581
{
582
    #[inline]
583
    fn from(arr: [OMatrix<T::Element, R, C>; 4]) -> Self {
584
        let (nrows, ncols) = arr[0].shape_generic();
585
586
        Self::from_fn_generic(nrows, ncols, |i, j| {
587
            [
588
                arr[0][(i, j)].clone(),
589
                arr[1][(i, j)].clone(),
590
                arr[2][(i, j)].clone(),
591
                arr[3][(i, j)].clone(),
592
            ]
593
            .into()
594
        })
595
    }
596
}
597
598
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 8]>
599
    for OMatrix<T, R, C>
600
where
601
    T: From<[<T as SimdValue>::Element; 8]>,
602
    T::Element: Scalar + SimdValue,
603
    DefaultAllocator: Allocator<R, C>,
604
{
605
    #[inline]
606
    fn from(arr: [OMatrix<T::Element, R, C>; 8]) -> Self {
607
        let (nrows, ncols) = arr[0].shape_generic();
608
609
        Self::from_fn_generic(nrows, ncols, |i, j| {
610
            [
611
                arr[0][(i, j)].clone(),
612
                arr[1][(i, j)].clone(),
613
                arr[2][(i, j)].clone(),
614
                arr[3][(i, j)].clone(),
615
                arr[4][(i, j)].clone(),
616
                arr[5][(i, j)].clone(),
617
                arr[6][(i, j)].clone(),
618
                arr[7][(i, j)].clone(),
619
            ]
620
            .into()
621
        })
622
    }
623
}
624
625
impl<T: Scalar + PrimitiveSimdValue, R: Dim, C: Dim> From<[OMatrix<T::Element, R, C>; 16]>
626
    for OMatrix<T, R, C>
627
where
628
    T: From<[<T as SimdValue>::Element; 16]>,
629
    T::Element: Scalar + SimdValue,
630
    DefaultAllocator: Allocator<R, C>,
631
{
632
    fn from(arr: [OMatrix<T::Element, R, C>; 16]) -> Self {
633
        let (nrows, ncols) = arr[0].shape_generic();
634
635
        Self::from_fn_generic(nrows, ncols, |i, j| {
636
            [
637
                arr[0][(i, j)].clone(),
638
                arr[1][(i, j)].clone(),
639
                arr[2][(i, j)].clone(),
640
                arr[3][(i, j)].clone(),
641
                arr[4][(i, j)].clone(),
642
                arr[5][(i, j)].clone(),
643
                arr[6][(i, j)].clone(),
644
                arr[7][(i, j)].clone(),
645
                arr[8][(i, j)].clone(),
646
                arr[9][(i, j)].clone(),
647
                arr[10][(i, j)].clone(),
648
                arr[11][(i, j)].clone(),
649
                arr[12][(i, j)].clone(),
650
                arr[13][(i, j)].clone(),
651
                arr[14][(i, j)].clone(),
652
                arr[15][(i, j)].clone(),
653
            ]
654
            .into()
655
        })
656
    }
657
}