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