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
134pub trait CopyMat<T> {
135 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
136 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize;
137 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize;
138 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
139}
140
141macro_rules! copy_mat {
142 ($matsize:ident) => {
143 impl<T> CopyMat<T> for Ref<$matsize<T>>
144 where T: Clone
145 {
146 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
147 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
148 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
149 for i in 0..src_ptr.len() {
150 dst_ptr[i + offset] = src_ptr[i].clone();
151 }
152 src_ptr.len()
153 }
154 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize {
155 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
156 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
157 for i in 0..src_ptr.len() {
158 dst_ptr[i + offset] = src_ptr[i].clone();
159 }
160 src_ptr.len()
161 }
162 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize {
163 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
164 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
165 for i in 0..src_ptr.len() {
166 dst_ptr[i + offset] = src_ptr[i].clone();
167 }
168 src_ptr.len()
169 }
170 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
171 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
172 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
173 let src_rows = src_ptr.nrows();
174 let dest_rows = dst_ptr.nrows();
175
176 let stride = dest_rows - src_rows;
177 let mut offset = offset;
178 for ix in 0..src_ptr.len() {
179 dst_ptr[offset] = src_ptr[ix].clone();
180 offset += ((ix + 1) % src_rows == 0) as usize * stride + 1;
181 }
182 src_rows
183 }}};}
184
185copy_mat!(DMatrix);
186copy_mat!(Matrix1);
187copy_mat!(Matrix2);
188copy_mat!(Matrix3);
189copy_mat!(Matrix4);
190copy_mat!(Matrix2x3);
191copy_mat!(Matrix3x2);
192copy_mat!(Vector2);
193copy_mat!(Vector3);
194copy_mat!(Vector4);
195copy_mat!(DVector);
196copy_mat!(RowVector2);
197copy_mat!(RowVector3);
198copy_mat!(RowVector4);
199copy_mat!(RowDVector);
200
201impl<T> Hash for Matrix<T>
202where T: Hash + na::Scalar
203{
204 fn hash<H: Hasher>(&self, state: &mut H) {
205 match self {
206 #[cfg(feature = "RowVector4")]
207 Matrix::RowVector4(x) => x.borrow().hash(state),
208 #[cfg(feature = "RowVector3")]
209 Matrix::RowVector3(x) => x.borrow().hash(state),
210 #[cfg(feature = "RowVector2")]
211 Matrix::RowVector2(x) => x.borrow().hash(state),
212 #[cfg(feature = "RowVectorD")]
213 Matrix::RowDVector(x) => x.borrow().hash(state),
214 #[cfg(feature = "Vector4")]
215 Matrix::Vector4(x) => x.borrow().hash(state),
216 #[cfg(feature = "Vector3")]
217 Matrix::Vector3(x) => x.borrow().hash(state),
218 #[cfg(feature = "Vector2")]
219 Matrix::Vector2(x) => x.borrow().hash(state),
220 #[cfg(feature = "VectorD")]
221 Matrix::DVector(x) => x.borrow().hash(state),
222 #[cfg(feature = "Matrix4")]
223 Matrix::Matrix4(x) => x.borrow().hash(state),
224 #[cfg(feature = "Matrix3")]
225 Matrix::Matrix3(x) => x.borrow().hash(state),
226 #[cfg(feature = "Matrix2")]
227 Matrix::Matrix2(x) => x.borrow().hash(state),
228 #[cfg(feature = "Matrix1")]
229 Matrix::Matrix1(x) => x.borrow().hash(state),
230 #[cfg(feature = "Matrix3x2")]
231 Matrix::Matrix3x2(x) => x.borrow().hash(state),
232 #[cfg(feature = "Matrix2x3")]
233 Matrix::Matrix2x3(x) => x.borrow().hash(state),
234 #[cfg(feature = "MatrixD")]
235 Matrix::DMatrix(x) => x.borrow().hash(state),
236 }
237 }
238}
239
240
241pub trait PrettyPrint {
242 fn pretty_print(&self) -> String;
243}
244
245impl PrettyPrint for String {
246 fn pretty_print(&self) -> String {
247 format!("\"{}\"", self)
248 }
249}
250
251impl PrettyPrint for Value {
252 fn pretty_print(&self) -> String {
253 self.pretty_print()
254 }
255}
256
257macro_rules! impl_pretty_print {
258 ($t:ty) => {
259 impl PrettyPrint for $t {
260 fn pretty_print(&self) -> String {
261 format!("{}", self)
262 }
263 }
264 };
265}
266
267impl_pretty_print!(bool);
268impl_pretty_print!(i8);
269impl_pretty_print!(i16);
270impl_pretty_print!(i32);
271impl_pretty_print!(i64);
272impl_pretty_print!(i128);
273impl_pretty_print!(u8);
274impl_pretty_print!(u16);
275impl_pretty_print!(u32);
276impl_pretty_print!(u64);
277impl_pretty_print!(u128);
278impl_pretty_print!(F32);
279impl_pretty_print!(F64);
280impl_pretty_print!(usize);
281
282impl<T> PrettyPrint for Matrix<T>
283where T: Debug + Display + Clone + PartialEq + 'static + PrettyPrint
284{
285 fn pretty_print(&self) -> String {
286 let mut builder = Builder::default();
287 match self {
288 #[cfg(feature = "RowVector4")]
289 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| x.pretty_print()).collect::<Vec<_>>()));}
290 #[cfg(feature = "RowVector3")]
291 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| x.pretty_print()).collect::<Vec<_>>()));}
292 #[cfg(feature = "RowVector2")]
293 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| x.pretty_print()).collect::<Vec<_>>()));}
294 #[cfg(feature = "RowVectorD")]
295 Matrix::RowDVector(vec) => {
296 let vec_brrw = vec.borrow();
297 let vec_str = if vec_brrw.ncols() > 20 {
298 let mut vec_str = vec_brrw.row(0).iter().take(10).chain(vec_brrw.row(0).iter().rev().take(9).rev()).map(|x| x.pretty_print()).collect::<Vec<_>>();
299 vec_str.insert(10,"...".to_string());
300 vec_str
301 } else {
302 vec_brrw.row(0).iter().map(|x| format!("{:?}", x)).collect::<Vec<_>>()
303 };
304 builder.push_record(vec_str);
305 }
306 #[cfg(feature = "Vector4")]
307 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| x.pretty_print()).collect::<Vec<_>>()));}
308 #[cfg(feature = "Vector3")]
309 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| x.pretty_print()).collect::<Vec<_>>()));}
310 #[cfg(feature = "Vector2")]
311 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| x.pretty_print()).collect::<Vec<_>>()));}
312 #[cfg(feature = "VectorD")]
313 Matrix::DVector(vec) => {
314 let vec_brrw = vec.borrow();
315 let vec_str = if vec_brrw.nrows() > 20 {
316 let mut vec_str = vec_brrw.column(0).iter().take(10).chain(vec_brrw.column(0).iter().rev().take(9).rev()).map(|x| x.pretty_print()).collect::<Vec<_>>();
317 vec_str.insert(10,"...".to_string());
318 vec_str
319 } else {
320 vec_brrw.column(0).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()
321 };
322 for r in vec_str {
323 builder.push_record(vec![r]);
324 }
325 }
326 #[cfg(feature = "Matrix4")]
327 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| x.pretty_print()).collect::<Vec<_>>()));}
328 #[cfg(feature = "Matrix3")]
329 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| x.pretty_print()).collect::<Vec<_>>()));}
330 #[cfg(feature = "Matrix2")]
331 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| x.pretty_print()).collect::<Vec<_>>()));}
332 #[cfg(feature = "Matrix1")]
333 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| x.pretty_print()).collect::<Vec<_>>()));}
334 #[cfg(feature = "Matrix3x2")]
335 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| x.pretty_print()).collect::<Vec<_>>()));}
336 #[cfg(feature = "Matrix2x3")]
337 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| x.pretty_print()).collect::<Vec<_>>()));}
338 #[cfg(feature = "MatrixD")]
339 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| x.pretty_print()).collect::<Vec<_>>()));}
340 _ => todo!(),
341 };
342 let matrix_style = Style::empty()
343 .top(' ')
344 .left('┃')
345 .right('┃')
346 .bottom(' ')
347 .vertical(' ')
348 .intersection_bottom(' ')
349 .corner_top_left('┏')
350 .corner_top_right('┓')
351 .corner_bottom_left('┗')
352 .corner_bottom_right('┛');
353 let mut table = builder.build();
354 table.with(matrix_style);
355 format!("{table}")
356 }
357}
358
359impl<T> Matrix<T>
360where T: Debug + Display + Clone + PartialEq + 'static + PrettyPrint
361{
362
363 pub fn size_of(&self) -> usize {
364 let vec = self.as_vec();
365 vec.capacity() * size_of::<T>()
366 }
367
368 pub fn get_copyable_matrix(&self) -> Box<dyn CopyMat<T>> {
369 match self {
370 #[cfg(feature = "RowVector4")]
371 Matrix::RowVector4(ref x) => Box::new(x.clone()),
372 #[cfg(feature = "RowVector3")]
373 Matrix::RowVector3(ref x) => Box::new(x.clone()),
374 #[cfg(feature = "RowVector2")]
375 Matrix::RowVector2(ref x) => Box::new(x.clone()),
376 #[cfg(feature = "RowVectorD")]
377 Matrix::RowDVector(ref x) => Box::new(x.clone()),
378 #[cfg(feature = "Vector4")]
379 Matrix::Vector4(ref x) => Box::new(x.clone()),
380 #[cfg(feature = "Vector3")]
381 Matrix::Vector3(ref x) => Box::new(x.clone()),
382 #[cfg(feature = "Vector2")]
383 Matrix::Vector2(ref x) => Box::new(x.clone()),
384 #[cfg(feature = "VectorD")]
385 Matrix::DVector(ref x) => Box::new(x.clone()),
386 #[cfg(feature = "Matrix4")]
387 Matrix::Matrix4(ref x) => Box::new(x.clone()),
388 #[cfg(feature = "Matrix3")]
389 Matrix::Matrix3(ref x) => Box::new(x.clone()),
390 #[cfg(feature = "Matrix2")]
391 Matrix::Matrix2(ref x) => Box::new(x.clone()),
392 #[cfg(feature = "Matrix1")]
393 Matrix::Matrix1(ref x) => Box::new(x.clone()),
394 #[cfg(feature = "Matrix3x2")]
395 Matrix::Matrix3x2(ref x) => Box::new(x.clone()),
396 #[cfg(feature = "Matrix2x3")]
397 Matrix::Matrix2x3(ref x) => Box::new(x.clone()),
398 #[cfg(feature = "MatrixD")]
399 Matrix::DMatrix(ref x) => Box::new(x.clone()),
400 }
401 }
402
403 pub fn shape(&self) -> Vec<usize> {
404 let shape = match self {
405 #[cfg(feature = "RowVector4")]
406 Matrix::RowVector4(x) => x.borrow().shape(),
407 #[cfg(feature = "RowVector3")]
408 Matrix::RowVector3(x) => x.borrow().shape(),
409 #[cfg(feature = "RowVector2")]
410 Matrix::RowVector2(x) => x.borrow().shape(),
411 #[cfg(feature = "RowVectorD")]
412 Matrix::RowDVector(x) => x.borrow().shape(),
413 #[cfg(feature = "Vector4")]
414 Matrix::Vector4(x) => x.borrow().shape(),
415 #[cfg(feature = "Vector3")]
416 Matrix::Vector3(x) => x.borrow().shape(),
417 #[cfg(feature = "Vector2")]
418 Matrix::Vector2(x) => x.borrow().shape(),
419 #[cfg(feature = "VectorD")]
420 Matrix::DVector(x) => x.borrow().shape(),
421 #[cfg(feature = "Matrix4")]
422 Matrix::Matrix4(x) => x.borrow().shape(),
423 #[cfg(feature = "Matrix3")]
424 Matrix::Matrix3(x) => x.borrow().shape(),
425 #[cfg(feature = "Matrix2")]
426 Matrix::Matrix2(x) => x.borrow().shape(),
427 #[cfg(feature = "Matrix1")]
428 Matrix::Matrix1(x) => x.borrow().shape(),
429 #[cfg(feature = "Matrix3x2")]
430 Matrix::Matrix3x2(x) => x.borrow().shape(),
431 #[cfg(feature = "Matrix2x3")]
432 Matrix::Matrix2x3(x) => x.borrow().shape(),
433 #[cfg(feature = "MatrixD")]
434 Matrix::DMatrix(x) => x.borrow().shape(),
435 };
436 vec![shape.0, shape.1]
437 }
438
439 pub fn index1d(&self, ix: usize) -> T {
440 match self {
441 #[cfg(feature = "RowVector4")]
442 Matrix::RowVector4(x) => (*x.borrow().index(ix-1)).clone(),
443 #[cfg(feature = "RowVector3")]
444 Matrix::RowVector3(x) => (*x.borrow().index(ix-1)).clone(),
445 #[cfg(feature = "RowVector2")]
446 Matrix::RowVector2(x) => (*x.borrow().index(ix-1)).clone(),
447 #[cfg(feature = "RowVectorD")]
448 Matrix::RowDVector(x) => (*x.borrow().index(ix-1)).clone(),
449 #[cfg(feature = "Vector4")]
450 Matrix::Vector4(x) => (*x.borrow().index(ix-1)).clone(),
451 #[cfg(feature = "Vector3")]
452 Matrix::Vector3(x) => (*x.borrow().index(ix-1)).clone(),
453 #[cfg(feature = "Vector2")]
454 Matrix::Vector2(x) => (*x.borrow().index(ix-1)).clone(),
455 #[cfg(feature = "VectorD")]
456 Matrix::DVector(x) => (*x.borrow().index(ix-1)).clone(),
457 #[cfg(feature = "Matrix4")]
458 Matrix::Matrix4(x) => (*x.borrow().index(ix-1)).clone(),
459 #[cfg(feature = "Matrix3")]
460 Matrix::Matrix3(x) => (*x.borrow().index(ix-1)).clone(),
461 #[cfg(feature = "Matrix2")]
462 Matrix::Matrix2(x) => (*x.borrow().index(ix-1)).clone(),
463 #[cfg(feature = "Matrix1")]
464 Matrix::Matrix1(x) => (*x.borrow().index(ix-1)).clone(),
465 #[cfg(feature = "Matrix3x2")]
466 Matrix::Matrix3x2(x) => (*x.borrow().index(ix-1)).clone(),
467 #[cfg(feature = "Matrix2x3")]
468 Matrix::Matrix2x3(x) => (*x.borrow().index(ix-1)).clone(),
469 #[cfg(feature = "MatrixD")]
470 Matrix::DMatrix(x) => (*x.borrow().index(ix-1)).clone(),
471 }
472 }
473
474 pub fn set(&self, elements: Vec<T>) {
475 match self {
476 #[cfg(feature = "RowVector4")]
477 Matrix::RowVector4(x) => {
478 let mut x = x.borrow_mut();
479 x[0] = elements[0].clone();
480 x[1] = elements[1].clone();
481 x[2] = elements[2].clone();
482 x[3] = elements[3].clone();
483 }
484 #[cfg(feature = "RowVector3")]
485 Matrix::RowVector3(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 }
491 #[cfg(feature = "RowVector2")]
492 Matrix::RowVector2(x) => {
493 let mut x = x.borrow_mut();
494 x[0] = elements[0].clone();
495 x[1] = elements[1].clone();
496 }
497 #[cfg(feature = "RowVectorD")]
498 Matrix::RowDVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
499 #[cfg(feature = "Vector4")]
500 Matrix::Vector4(x) => {
501 let mut x = x.borrow_mut();
502 x[0] = elements[0].clone();
503 x[1] = elements[1].clone();
504 x[2] = elements[2].clone();
505 x[3] = elements[3].clone();
506 }
507 #[cfg(feature = "Vector3")]
508 Matrix::Vector3(x) => {
509 let mut x = x.borrow_mut();
510 x[0] = elements[0].clone();
511 x[1] = elements[1].clone();
512 x[2] = elements[2].clone();
513 }
514 #[cfg(feature = "Vector2")]
515 Matrix::Vector2(x) => {
516 let mut x = x.borrow_mut();
517 x[0] = elements[0].clone();
518 x[1] = elements[1].clone();
519 }
520 #[cfg(feature = "VectorD")]
521 Matrix::DVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
522 #[cfg(feature = "Matrix4")]
523 Matrix::Matrix4(x) => {
524 let mut x = x.borrow_mut();
525 x[0] = elements[0].clone();
526 x[1] = elements[1].clone();
527 x[2] = elements[2].clone();
528 x[3] = elements[3].clone();
529 x[4] = elements[4].clone();
530 x[5] = elements[5].clone();
531 x[6] = elements[6].clone();
532 x[7] = elements[7].clone();
533 x[8] = elements[8].clone();
534 x[9] = elements[9].clone();
535 x[10] = elements[10].clone();
536 x[11] = elements[11].clone();
537 x[12] = elements[12].clone();
538 x[13] = elements[13].clone();
539 x[14] = elements[14].clone();
540 x[15] = elements[15].clone();
541 }
542 #[cfg(feature = "Matrix3")]
543 Matrix::Matrix3(x) => {
544 let mut x = x.borrow_mut();
545 x[0] = elements[0].clone();
546 x[1] = elements[1].clone();
547 x[2] = elements[2].clone();
548 x[3] = elements[3].clone();
549 x[4] = elements[4].clone();
550 x[5] = elements[5].clone();
551 x[6] = elements[6].clone();
552 x[7] = elements[7].clone();
553 x[8] = elements[8].clone();
554 }
555 #[cfg(feature = "Matrix2")]
556 Matrix::Matrix2(x) => {
557 let mut x = x.borrow_mut();
558 x[0] = elements[0].clone();
559 x[1] = elements[1].clone();
560 x[2] = elements[2].clone();
561 x[3] = elements[3].clone();
562 }
563 #[cfg(feature = "Matrix1")]
564 Matrix::Matrix1(x) => {let mut x = x.borrow_mut();x[0] = elements[0].clone();},
565 #[cfg(feature = "Matrix3x2")]
566 Matrix::Matrix3x2(x) => {
567 let mut x = x.borrow_mut();
568 x[0] = elements[0].clone();
569 x[1] = elements[1].clone();
570 x[2] = elements[2].clone();
571 x[3] = elements[3].clone();
572 x[4] = elements[4].clone();
573 x[5] = elements[5].clone();
574 }
575 #[cfg(feature = "Matrix2x3")]
576 Matrix::Matrix2x3(x) => {
577 let mut x = x.borrow_mut();
578 x[0] = elements[0].clone();
579 x[1] = elements[1].clone();
580 x[2] = elements[2].clone();
581 x[3] = elements[3].clone();
582 x[4] = elements[4].clone();
583 x[5] = elements[5].clone();
584 }
585 #[cfg(feature = "MatrixD")]
586 Matrix::DMatrix(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
587 }
588 }
589
590 pub fn index2d(&self, row: usize, col: usize) -> T {
591 match self {
592 #[cfg(feature = "RowVector4")]
593 Matrix::RowVector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
594 #[cfg(feature = "RowVector3")]
595 Matrix::RowVector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
596 #[cfg(feature = "RowVector2")]
597 Matrix::RowVector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
598 #[cfg(feature = "RowVectorD")]
599 Matrix::RowDVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
600 #[cfg(feature = "Vector4")]
601 Matrix::Vector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
602 #[cfg(feature = "Vector3")]
603 Matrix::Vector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
604 #[cfg(feature = "Vector2")]
605 Matrix::Vector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
606 #[cfg(feature = "VectorD")]
607 Matrix::DVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
608 #[cfg(feature = "Matrix4")]
609 Matrix::Matrix4(x) => (*x.borrow().index((row-1,col-1))).clone(),
610 #[cfg(feature = "Matrix3")]
611 Matrix::Matrix3(x) => (*x.borrow().index((row-1,col-1))).clone(),
612 #[cfg(feature = "Matrix2")]
613 Matrix::Matrix2(x) => (*x.borrow().index((row-1,col-1))).clone(),
614 #[cfg(feature = "Matrix1")]
615 Matrix::Matrix1(x) => (*x.borrow().index((row-1,col-1))).clone(),
616 #[cfg(feature = "Matrix3x2")]
617 Matrix::Matrix3x2(x) => (*x.borrow().index((row-1,col-1))).clone(),
618 #[cfg(feature = "Matrix2x3")]
619 Matrix::Matrix2x3(x) => (*x.borrow().index((row-1,col-1))).clone(),
620 #[cfg(feature = "MatrixD")]
621 Matrix::DMatrix(x) => (*x.borrow().index((row-1,col-1))).clone(),
622 }
623 }
624
625 pub fn as_vec(&self) -> Vec<T> {
626 match self {
627 #[cfg(feature = "RowVector4")]
628 Matrix::RowVector4(x) => x.borrow().as_slice().to_vec(),
629 #[cfg(feature = "RowVector3")]
630 Matrix::RowVector3(x) => x.borrow().as_slice().to_vec(),
631 #[cfg(feature = "RowVector2")]
632 Matrix::RowVector2(x) => x.borrow().as_slice().to_vec(),
633 #[cfg(feature = "RowVectorD")]
634 Matrix::RowDVector(x) => x.borrow().as_slice().to_vec(),
635 #[cfg(feature = "Vector4")]
636 Matrix::Vector4(x) => x.borrow().as_slice().to_vec(),
637 #[cfg(feature = "Vector3")]
638 Matrix::Vector3(x) => x.borrow().as_slice().to_vec(),
639 #[cfg(feature = "Vector2")]
640 Matrix::Vector2(x) => x.borrow().as_slice().to_vec(),
641 #[cfg(feature = "VectorD")]
642 Matrix::DVector(x) => x.borrow().as_slice().to_vec(),
643 #[cfg(feature = "Matrix4")]
644 Matrix::Matrix4(x) => x.borrow().as_slice().to_vec(),
645 #[cfg(feature = "Matrix3")]
646 Matrix::Matrix3(x) => x.borrow().as_slice().to_vec(),
647 #[cfg(feature = "Matrix2")]
648 Matrix::Matrix2(x) => x.borrow().as_slice().to_vec(),
649 #[cfg(feature = "Matrix1")]
650 Matrix::Matrix1(x) => x.borrow().as_slice().to_vec(),
651 #[cfg(feature = "Matrix3x2")]
652 Matrix::Matrix3x2(x) => x.borrow().as_slice().to_vec(),
653 #[cfg(feature = "Matrix2x3")]
654 Matrix::Matrix2x3(x) => x.borrow().as_slice().to_vec(),
655 #[cfg(feature = "MatrixD")]
656 Matrix::DMatrix(x) => x.borrow().as_slice().to_vec(),
657 }
658 }
659
660}
661
662
663impl ToValue for Matrix<Value> {
664
665 fn to_value(&self) -> Value {
666 Value::MatrixValue(self.clone())
667 }
668
669}