1use crate::*;
2use crate::types::Ref;
3use na::{Vector3, DVector, Vector2, Vector4, RowDVector, Matrix1, Matrix3, Matrix4, RowVector3, RowVector4, RowVector2, DMatrix, Rotation3, Matrix2x3, Matrix3x2, Matrix6, Matrix2};
4use tabled::{
5 builder::Builder,
6 settings::{object::Rows,Panel, Span, Alignment, Modify, Style},
7 Tabled,
8 };
9use std::fmt::{Debug, Display};
10use std::hash::{Hash, Hasher};
11use std::slice::Iter;
12use std::iter::Peekable;
13use serde::ser::{Serialize, Serializer, SerializeStruct};
14
15pub trait ToMatrix: Clone {
18 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self>;
19}
20
21macro_rules! impl_to_matrix {
22 ($t:ty) => {
23 impl ToMatrix for $t {
24 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
25 match (rows,cols) {
26 #[cfg(feature = "Matrix1")]
27 (1,1) => Matrix::Matrix1(new_ref(Matrix1::from_element(elements[0].clone()))),
28 #[cfg(feature = "Matrix2")]
29 (2,2) => Matrix::Matrix2(new_ref(Matrix2::from_vec(elements))),
30 #[cfg(feature = "Matrix3")]
31 (3,3) => Matrix::Matrix3(new_ref(Matrix3::from_vec(elements))),
32 #[cfg(feature = "Matrix4")]
33 (4,4) => Matrix::Matrix4(new_ref(Matrix4::from_vec(elements))),
34 #[cfg(feature = "Matrix2x3")]
35 (2,3) => Matrix::Matrix2x3(new_ref(Matrix2x3::from_vec(elements))),
36 #[cfg(feature = "Matrix3x2")]
37 (3,2) => Matrix::Matrix3x2(new_ref(Matrix3x2::from_vec(elements))),
38 #[cfg(feature = "RowVector2")]
39 (1,2) => Matrix::RowVector2(new_ref(RowVector2::from_vec(elements))),
40 #[cfg(feature = "RowVector3")]
41 (1,3) => Matrix::RowVector3(new_ref(RowVector3::from_vec(elements))),
42 #[cfg(feature = "RowVector4")]
43 (1,4) => Matrix::RowVector4(new_ref(RowVector4::from_vec(elements))),
44 #[cfg(feature = "Vector2")]
45 (2,1) => Matrix::Vector2(new_ref(Vector2::from_vec(elements))),
46 #[cfg(feature = "Vector2")]
47 (3,1) => Matrix::Vector3(new_ref(Vector3::from_vec(elements))),
48 #[cfg(feature = "Vector2")]
49 (4,1) => Matrix::Vector4(new_ref(Vector4::from_vec(elements))),
50 #[cfg(feature = "RowVectorD")]
51 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
52 #[cfg(feature = "VectorD")]
53 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
54 #[cfg(feature = "MatrixD")]
55 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
56 }}}};}
57
58impl ToMatrix for usize {
59 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
60 match (rows,cols) {
61 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
62 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
63 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
64 }
65 }
66}
67
68impl_to_matrix!(Value);
69#[cfg(feature = "Bool")]
70impl_to_matrix!(bool);
71#[cfg(feature = "U8")]
72impl_to_matrix!(u8);
73#[cfg(feature = "U16")]
74impl_to_matrix!(u16);
75#[cfg(feature = "U32")]
76impl_to_matrix!(u32);
77#[cfg(feature = "U64")]
78impl_to_matrix!(u64);
79#[cfg(feature = "U128")]
80impl_to_matrix!(u128);
81#[cfg(feature = "I8")]
82impl_to_matrix!(i8);
83#[cfg(feature = "I16")]
84impl_to_matrix!(i16);
85#[cfg(feature = "I32")]
86impl_to_matrix!(i32);
87#[cfg(feature = "I64")]
88impl_to_matrix!(i64);
89#[cfg(feature = "I128")]
90impl_to_matrix!(i128);
91#[cfg(feature = "F32")]
92impl_to_matrix!(F32);
93#[cfg(feature = "F64")]
94impl_to_matrix!(F64);
95
96pub trait ToIndex: Clone {
97 fn to_index(elements: Vec<Self>) -> Matrix<Self>;
98}
99
100#[derive(Clone, Debug, PartialEq, Eq)]
101pub enum Matrix<T> {
102 #[cfg(feature = "RowVector4")]
103 RowVector4(Ref<RowVector4<T>>),
104 #[cfg(feature = "RowVector3")]
105 RowVector3(Ref<RowVector3<T>>),
106 #[cfg(feature = "RowVector2")]
107 RowVector2(Ref<RowVector2<T>>),
108 #[cfg(feature = "RowVectorD")]
109 RowDVector(Ref<RowDVector<T>>),
110 #[cfg(feature = "Vector4")]
111 Vector4(Ref<Vector4<T>>),
112 #[cfg(feature = "Vector3")]
113 Vector3(Ref<Vector3<T>>),
114 #[cfg(feature = "Vector2")]
115 Vector2(Ref<Vector2<T>>),
116 #[cfg(feature = "VectorD")]
117 DVector(Ref<DVector<T>>),
118 #[cfg(feature = "Matrix4")]
119 Matrix4(Ref<Matrix4<T>>),
120 #[cfg(feature = "Matrix3")]
121 Matrix3(Ref<Matrix3<T>>),
122 #[cfg(feature = "Matrix2")]
123 Matrix2(Ref<Matrix2<T>>),
124 #[cfg(feature = "Matrix1")]
125 Matrix1(Ref<Matrix1<T>>),
126 #[cfg(feature = "Matrix3x2")]
127 Matrix3x2(Ref<Matrix3x2<T>>),
128 #[cfg(feature = "Matrix2x3")]
129 Matrix2x3(Ref<Matrix2x3<T>>),
130 #[cfg(feature = "MatrixD")]
131 DMatrix(Ref<DMatrix<T>>),
132}
133
134impl<T> fmt::Display for Matrix<T>
135where T: Debug + Display + Clone + PartialEq + 'static {
136 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
137 std::fmt::Display::fmt(&self.pretty_print(), f)
138 }
139}
140
141pub trait CopyMat<T> {
142 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
143 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize;
144 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize;
145 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
146}
147
148macro_rules! copy_mat {
149 ($matsize:ident) => {
150 impl<T> CopyMat<T> for Ref<$matsize<T>>
151 where T: Clone
152 {
153 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
154 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
155 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
156 for i in 0..src_ptr.len() {
157 dst_ptr[i + offset] = src_ptr[i].clone();
158 }
159 src_ptr.len()
160 }
161 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize {
162 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
163 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
164 for i in 0..src_ptr.len() {
165 dst_ptr[i + offset] = src_ptr[i].clone();
166 }
167 src_ptr.len()
168 }
169 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize {
170 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
171 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
172 for i in 0..src_ptr.len() {
173 dst_ptr[i + offset] = src_ptr[i].clone();
174 }
175 src_ptr.len()
176 }
177 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
178 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
179 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
180 let src_rows = src_ptr.nrows();
181 let dest_rows = dst_ptr.nrows();
182
183 let stride = dest_rows - src_rows;
184 let mut offset = offset;
185 for ix in 0..src_ptr.len() {
186 dst_ptr[offset] = src_ptr[ix].clone();
187 offset += ((ix + 1) % src_rows == 0) as usize * stride + 1;
188 }
189 src_rows
190 }}};}
191
192copy_mat!(DMatrix);
193copy_mat!(Matrix1);
194copy_mat!(Matrix2);
195copy_mat!(Matrix3);
196copy_mat!(Matrix4);
197copy_mat!(Matrix2x3);
198copy_mat!(Matrix3x2);
199copy_mat!(Vector2);
200copy_mat!(Vector3);
201copy_mat!(Vector4);
202copy_mat!(DVector);
203copy_mat!(RowVector2);
204copy_mat!(RowVector3);
205copy_mat!(RowVector4);
206copy_mat!(RowDVector);
207
208impl<T> Hash for Matrix<T>
209where T: Hash + na::Scalar
210{
211 fn hash<H: Hasher>(&self, state: &mut H) {
212 match self {
213 #[cfg(feature = "RowVector4")]
214 Matrix::RowVector4(x) => x.borrow().hash(state),
215 #[cfg(feature = "RowVector3")]
216 Matrix::RowVector3(x) => x.borrow().hash(state),
217 #[cfg(feature = "RowVector2")]
218 Matrix::RowVector2(x) => x.borrow().hash(state),
219 #[cfg(feature = "RowVectorD")]
220 Matrix::RowDVector(x) => x.borrow().hash(state),
221 #[cfg(feature = "Vector4")]
222 Matrix::Vector4(x) => x.borrow().hash(state),
223 #[cfg(feature = "Vector3")]
224 Matrix::Vector3(x) => x.borrow().hash(state),
225 #[cfg(feature = "Vector2")]
226 Matrix::Vector2(x) => x.borrow().hash(state),
227 #[cfg(feature = "VectorD")]
228 Matrix::DVector(x) => x.borrow().hash(state),
229 #[cfg(feature = "Matrix4")]
230 Matrix::Matrix4(x) => x.borrow().hash(state),
231 #[cfg(feature = "Matrix3")]
232 Matrix::Matrix3(x) => x.borrow().hash(state),
233 #[cfg(feature = "Matrix2")]
234 Matrix::Matrix2(x) => x.borrow().hash(state),
235 #[cfg(feature = "Matrix1")]
236 Matrix::Matrix1(x) => x.borrow().hash(state),
237 #[cfg(feature = "Matrix3x2")]
238 Matrix::Matrix3x2(x) => x.borrow().hash(state),
239 #[cfg(feature = "Matrix2x3")]
240 Matrix::Matrix2x3(x) => x.borrow().hash(state),
241 #[cfg(feature = "MatrixD")]
242 Matrix::DMatrix(x) => x.borrow().hash(state),
243 }
244 }
245}
246
247impl<T> Matrix<T>
248where T: Debug + Display + Clone + PartialEq + 'static
249{
250
251 pub fn size_of(&self) -> usize {
252 let vec = self.as_vec();
253 vec.capacity() * size_of::<T>()
254 }
255
256 pub fn get_copyable_matrix(&self) -> Box<dyn CopyMat<T>> {
257 match self {
258 #[cfg(feature = "RowVector4")]
259 Matrix::RowVector4(ref x) => Box::new(x.clone()),
260 #[cfg(feature = "RowVector3")]
261 Matrix::RowVector3(ref x) => Box::new(x.clone()),
262 #[cfg(feature = "RowVector2")]
263 Matrix::RowVector2(ref x) => Box::new(x.clone()),
264 #[cfg(feature = "RowVectorD")]
265 Matrix::RowDVector(ref x) => Box::new(x.clone()),
266 #[cfg(feature = "Vector4")]
267 Matrix::Vector4(ref x) => Box::new(x.clone()),
268 #[cfg(feature = "Vector3")]
269 Matrix::Vector3(ref x) => Box::new(x.clone()),
270 #[cfg(feature = "Vector2")]
271 Matrix::Vector2(ref x) => Box::new(x.clone()),
272 #[cfg(feature = "VectorD")]
273 Matrix::DVector(ref x) => Box::new(x.clone()),
274 #[cfg(feature = "Matrix4")]
275 Matrix::Matrix4(ref x) => Box::new(x.clone()),
276 #[cfg(feature = "Matrix3")]
277 Matrix::Matrix3(ref x) => Box::new(x.clone()),
278 #[cfg(feature = "Matrix2")]
279 Matrix::Matrix2(ref x) => Box::new(x.clone()),
280 #[cfg(feature = "Matrix1")]
281 Matrix::Matrix1(ref x) => Box::new(x.clone()),
282 #[cfg(feature = "Matrix3x2")]
283 Matrix::Matrix3x2(ref x) => Box::new(x.clone()),
284 #[cfg(feature = "Matrix2x3")]
285 Matrix::Matrix2x3(ref x) => Box::new(x.clone()),
286 #[cfg(feature = "MatrixD")]
287 Matrix::DMatrix(ref x) => Box::new(x.clone()),
288 }
289 }
290
291
292 pub fn pretty_print(&self) -> String {
293 let mut builder = Builder::default();
294 match self {
295 #[cfg(feature = "RowVector4")]
296 Matrix::RowVector4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
297 #[cfg(feature = "RowVector3")]
298 Matrix::RowVector3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
299 #[cfg(feature = "RowVector2")]
300 Matrix::RowVector2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
301 #[cfg(feature = "RowVectorD")]
302 Matrix::RowDVector(vec) => {
303 let vec_brrw = vec.borrow();
304 let vec_str = if vec_brrw.ncols() > 20 {
305 let mut vec_str = vec_brrw.row(0).iter().take(10).chain(vec_brrw.row(0).iter().rev().take(9).rev()).map(|x| format!("{}", x)).collect::<Vec<_>>();
306 vec_str.insert(10,"...".to_string());
307 vec_str
308 } else {
309 vec_brrw.row(0).iter().map(|x| format!("{:?}", x)).collect::<Vec<_>>()
310 };
311 builder.push_record(vec_str);
312 }
313 #[cfg(feature = "Vector4")]
314 Matrix::Vector4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
315 #[cfg(feature = "Vector3")]
316 Matrix::Vector3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
317 #[cfg(feature = "Vector2")]
318 Matrix::Vector2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
319 #[cfg(feature = "VectorD")]
320 Matrix::DVector(vec) => {
321 let vec_brrw = vec.borrow();
322 let vec_str = if vec_brrw.nrows() > 20 {
323 let mut vec_str = vec_brrw.column(0).iter().take(10).chain(vec_brrw.column(0).iter().rev().take(9).rev()).map(|x| format!("{}", x)).collect::<Vec<_>>();
324 vec_str.insert(10,"...".to_string());
325 vec_str
326 } else {
327 vec_brrw.column(0).iter().map(|x| format!("{:?}", x)).collect::<Vec<_>>()
328 };
329 for r in vec_str {
330 builder.push_record(vec![r]);
331 }
332 }
333 #[cfg(feature = "Matrix4")]
334 Matrix::Matrix4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
335 #[cfg(feature = "Matrix3")]
336 Matrix::Matrix3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
337 #[cfg(feature = "Matrix2")]
338 Matrix::Matrix2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
339 #[cfg(feature = "Matrix1")]
340 Matrix::Matrix1(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
341 #[cfg(feature = "Matrix3x2")]
342 Matrix::Matrix3x2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
343 #[cfg(feature = "Matrix2x3")]
344 Matrix::Matrix2x3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
345 #[cfg(feature = "MatrixD")]
346 Matrix::DMatrix(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| format!("{}", x)).collect::<Vec<_>>()));}
347 _ => todo!(),
348 };
349 let matrix_style = Style::empty()
350 .top(' ')
351 .left('┃')
352 .right('┃')
353 .bottom(' ')
354 .vertical(' ')
355 .intersection_bottom(' ')
356 .corner_top_left('┏')
357 .corner_top_right('┓')
358 .corner_bottom_left('┗')
359 .corner_bottom_right('┛');
360 let mut table = builder.build();
361 table.with(matrix_style);
362 format!("{table}")
363 }
364
365 pub fn shape(&self) -> Vec<usize> {
366 let shape = match self {
367 #[cfg(feature = "RowVector4")]
368 Matrix::RowVector4(x) => x.borrow().shape(),
369 #[cfg(feature = "RowVector3")]
370 Matrix::RowVector3(x) => x.borrow().shape(),
371 #[cfg(feature = "RowVector2")]
372 Matrix::RowVector2(x) => x.borrow().shape(),
373 #[cfg(feature = "RowVectorD")]
374 Matrix::RowDVector(x) => x.borrow().shape(),
375 #[cfg(feature = "Vector4")]
376 Matrix::Vector4(x) => x.borrow().shape(),
377 #[cfg(feature = "Vector3")]
378 Matrix::Vector3(x) => x.borrow().shape(),
379 #[cfg(feature = "Vector2")]
380 Matrix::Vector2(x) => x.borrow().shape(),
381 #[cfg(feature = "VectorD")]
382 Matrix::DVector(x) => x.borrow().shape(),
383 #[cfg(feature = "Matrix4")]
384 Matrix::Matrix4(x) => x.borrow().shape(),
385 #[cfg(feature = "Matrix3")]
386 Matrix::Matrix3(x) => x.borrow().shape(),
387 #[cfg(feature = "Matrix2")]
388 Matrix::Matrix2(x) => x.borrow().shape(),
389 #[cfg(feature = "Matrix1")]
390 Matrix::Matrix1(x) => x.borrow().shape(),
391 #[cfg(feature = "Matrix3x2")]
392 Matrix::Matrix3x2(x) => x.borrow().shape(),
393 #[cfg(feature = "Matrix2x3")]
394 Matrix::Matrix2x3(x) => x.borrow().shape(),
395 #[cfg(feature = "MatrixD")]
396 Matrix::DMatrix(x) => x.borrow().shape(),
397 };
398 vec![shape.0, shape.1]
399 }
400
401 pub fn index1d(&self, ix: usize) -> T {
402 match self {
403 #[cfg(feature = "RowVector4")]
404 Matrix::RowVector4(x) => (*x.borrow().index(ix-1)).clone(),
405 #[cfg(feature = "RowVector3")]
406 Matrix::RowVector3(x) => (*x.borrow().index(ix-1)).clone(),
407 #[cfg(feature = "RowVector2")]
408 Matrix::RowVector2(x) => (*x.borrow().index(ix-1)).clone(),
409 #[cfg(feature = "RowVectorD")]
410 Matrix::RowDVector(x) => (*x.borrow().index(ix-1)).clone(),
411 #[cfg(feature = "Vector4")]
412 Matrix::Vector4(x) => (*x.borrow().index(ix-1)).clone(),
413 #[cfg(feature = "Vector3")]
414 Matrix::Vector3(x) => (*x.borrow().index(ix-1)).clone(),
415 #[cfg(feature = "Vector2")]
416 Matrix::Vector2(x) => (*x.borrow().index(ix-1)).clone(),
417 #[cfg(feature = "VectorD")]
418 Matrix::DVector(x) => (*x.borrow().index(ix-1)).clone(),
419 #[cfg(feature = "Matrix4")]
420 Matrix::Matrix4(x) => (*x.borrow().index(ix-1)).clone(),
421 #[cfg(feature = "Matrix3")]
422 Matrix::Matrix3(x) => (*x.borrow().index(ix-1)).clone(),
423 #[cfg(feature = "Matrix2")]
424 Matrix::Matrix2(x) => (*x.borrow().index(ix-1)).clone(),
425 #[cfg(feature = "Matrix1")]
426 Matrix::Matrix1(x) => (*x.borrow().index(ix-1)).clone(),
427 #[cfg(feature = "Matrix3x2")]
428 Matrix::Matrix3x2(x) => (*x.borrow().index(ix-1)).clone(),
429 #[cfg(feature = "Matrix2x3")]
430 Matrix::Matrix2x3(x) => (*x.borrow().index(ix-1)).clone(),
431 #[cfg(feature = "MatrixD")]
432 Matrix::DMatrix(x) => (*x.borrow().index(ix-1)).clone(),
433 }
434 }
435
436 pub fn set(&self, elements: Vec<T>) {
437 match self {
438 #[cfg(feature = "RowVector4")]
439 Matrix::RowVector4(x) => {
440 let mut x = x.borrow_mut();
441 x[0] = elements[0].clone();
442 x[1] = elements[1].clone();
443 x[2] = elements[2].clone();
444 x[3] = elements[3].clone();
445 }
446 #[cfg(feature = "RowVector3")]
447 Matrix::RowVector3(x) => {
448 let mut x = x.borrow_mut();
449 x[0] = elements[0].clone();
450 x[1] = elements[1].clone();
451 x[2] = elements[2].clone();
452 }
453 #[cfg(feature = "RowVector2")]
454 Matrix::RowVector2(x) => {
455 let mut x = x.borrow_mut();
456 x[0] = elements[0].clone();
457 x[1] = elements[1].clone();
458 }
459 #[cfg(feature = "RowVectorD")]
460 Matrix::RowDVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
461 #[cfg(feature = "Vector4")]
462 Matrix::Vector4(x) => {
463 let mut x = x.borrow_mut();
464 x[0] = elements[0].clone();
465 x[1] = elements[1].clone();
466 x[2] = elements[2].clone();
467 x[3] = elements[3].clone();
468 }
469 #[cfg(feature = "Vector3")]
470 Matrix::Vector3(x) => {
471 let mut x = x.borrow_mut();
472 x[0] = elements[0].clone();
473 x[1] = elements[1].clone();
474 x[2] = elements[2].clone();
475 }
476 #[cfg(feature = "Vector2")]
477 Matrix::Vector2(x) => {
478 let mut x = x.borrow_mut();
479 x[0] = elements[0].clone();
480 x[1] = elements[1].clone();
481 }
482 #[cfg(feature = "VectorD")]
483 Matrix::DVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
484 #[cfg(feature = "Matrix4")]
485 Matrix::Matrix4(x) => {
486 let mut x = x.borrow_mut();
487 x[0] = elements[0].clone();
488 x[1] = elements[1].clone();
489 x[2] = elements[2].clone();
490 x[3] = elements[3].clone();
491 x[4] = elements[4].clone();
492 x[5] = elements[5].clone();
493 x[6] = elements[6].clone();
494 x[7] = elements[7].clone();
495 x[8] = elements[8].clone();
496 x[9] = elements[9].clone();
497 x[10] = elements[10].clone();
498 x[11] = elements[11].clone();
499 x[12] = elements[12].clone();
500 x[13] = elements[13].clone();
501 x[14] = elements[14].clone();
502 x[15] = elements[15].clone();
503 }
504 #[cfg(feature = "Matrix3")]
505 Matrix::Matrix3(x) => {
506 let mut x = x.borrow_mut();
507 x[0] = elements[0].clone();
508 x[1] = elements[1].clone();
509 x[2] = elements[2].clone();
510 x[3] = elements[3].clone();
511 x[4] = elements[4].clone();
512 x[5] = elements[5].clone();
513 x[6] = elements[6].clone();
514 x[7] = elements[7].clone();
515 x[8] = elements[8].clone();
516 }
517 #[cfg(feature = "Matrix2")]
518 Matrix::Matrix2(x) => {
519 let mut x = x.borrow_mut();
520 x[0] = elements[0].clone();
521 x[1] = elements[1].clone();
522 x[2] = elements[2].clone();
523 x[3] = elements[3].clone();
524 }
525 #[cfg(feature = "Matrix1")]
526 Matrix::Matrix1(x) => {let mut x = x.borrow_mut();x[0] = elements[0].clone();},
527 #[cfg(feature = "Matrix3x2")]
528 Matrix::Matrix3x2(x) => {
529 let mut x = x.borrow_mut();
530 x[0] = elements[0].clone();
531 x[1] = elements[1].clone();
532 x[2] = elements[2].clone();
533 x[3] = elements[3].clone();
534 x[4] = elements[4].clone();
535 x[5] = elements[5].clone();
536 }
537 #[cfg(feature = "Matrix2x3")]
538 Matrix::Matrix2x3(x) => {
539 let mut x = x.borrow_mut();
540 x[0] = elements[0].clone();
541 x[1] = elements[1].clone();
542 x[2] = elements[2].clone();
543 x[3] = elements[3].clone();
544 x[4] = elements[4].clone();
545 x[5] = elements[5].clone();
546 }
547 #[cfg(feature = "MatrixD")]
548 Matrix::DMatrix(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
549 }
550 }
551
552 pub fn index2d(&self, row: usize, col: usize) -> T {
553 match self {
554 #[cfg(feature = "RowVector4")]
555 Matrix::RowVector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
556 #[cfg(feature = "RowVector3")]
557 Matrix::RowVector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
558 #[cfg(feature = "RowVector2")]
559 Matrix::RowVector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
560 #[cfg(feature = "RowVectorD")]
561 Matrix::RowDVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
562 #[cfg(feature = "Vector4")]
563 Matrix::Vector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
564 #[cfg(feature = "Vector3")]
565 Matrix::Vector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
566 #[cfg(feature = "Vector2")]
567 Matrix::Vector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
568 #[cfg(feature = "VectorD")]
569 Matrix::DVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
570 #[cfg(feature = "Matrix4")]
571 Matrix::Matrix4(x) => (*x.borrow().index((row-1,col-1))).clone(),
572 #[cfg(feature = "Matrix3")]
573 Matrix::Matrix3(x) => (*x.borrow().index((row-1,col-1))).clone(),
574 #[cfg(feature = "Matrix2")]
575 Matrix::Matrix2(x) => (*x.borrow().index((row-1,col-1))).clone(),
576 #[cfg(feature = "Matrix1")]
577 Matrix::Matrix1(x) => (*x.borrow().index((row-1,col-1))).clone(),
578 #[cfg(feature = "Matrix3x2")]
579 Matrix::Matrix3x2(x) => (*x.borrow().index((row-1,col-1))).clone(),
580 #[cfg(feature = "Matrix2x3")]
581 Matrix::Matrix2x3(x) => (*x.borrow().index((row-1,col-1))).clone(),
582 #[cfg(feature = "MatrixD")]
583 Matrix::DMatrix(x) => (*x.borrow().index((row-1,col-1))).clone(),
584 }
585 }
586
587 pub fn as_vec(&self) -> Vec<T> {
588 match self {
589 #[cfg(feature = "RowVector4")]
590 Matrix::RowVector4(x) => x.borrow().as_slice().to_vec(),
591 #[cfg(feature = "RowVector3")]
592 Matrix::RowVector3(x) => x.borrow().as_slice().to_vec(),
593 #[cfg(feature = "RowVector2")]
594 Matrix::RowVector2(x) => x.borrow().as_slice().to_vec(),
595 #[cfg(feature = "RowVectorD")]
596 Matrix::RowDVector(x) => x.borrow().as_slice().to_vec(),
597 #[cfg(feature = "Vector4")]
598 Matrix::Vector4(x) => x.borrow().as_slice().to_vec(),
599 #[cfg(feature = "Vector3")]
600 Matrix::Vector3(x) => x.borrow().as_slice().to_vec(),
601 #[cfg(feature = "Vector2")]
602 Matrix::Vector2(x) => x.borrow().as_slice().to_vec(),
603 #[cfg(feature = "VectorD")]
604 Matrix::DVector(x) => x.borrow().as_slice().to_vec(),
605 #[cfg(feature = "Matrix4")]
606 Matrix::Matrix4(x) => x.borrow().as_slice().to_vec(),
607 #[cfg(feature = "Matrix3")]
608 Matrix::Matrix3(x) => x.borrow().as_slice().to_vec(),
609 #[cfg(feature = "Matrix2")]
610 Matrix::Matrix2(x) => x.borrow().as_slice().to_vec(),
611 #[cfg(feature = "Matrix1")]
612 Matrix::Matrix1(x) => x.borrow().as_slice().to_vec(),
613 #[cfg(feature = "Matrix3x2")]
614 Matrix::Matrix3x2(x) => x.borrow().as_slice().to_vec(),
615 #[cfg(feature = "Matrix2x3")]
616 Matrix::Matrix2x3(x) => x.borrow().as_slice().to_vec(),
617 #[cfg(feature = "MatrixD")]
618 Matrix::DMatrix(x) => x.borrow().as_slice().to_vec(),
619 }
620 }
621
622}
623
624
625impl ToValue for Matrix<Value> {
626
627 fn to_value(&self) -> Value {
628 Value::MatrixValue(self.clone())
629 }
630
631}