1#[macro_use]
2use crate::stdlib::*;
3
4macro_rules! access_1d {
7 ($source:expr, $ix:expr, $out:expr) => {
8 unsafe { *$out = (*$source).index(*$ix - 1).clone() }
9 };}
10
11macro_rules! access_2d {
12 ($source:expr, $ix:expr, $out:expr) => {
13 unsafe {
14 let ix1 = (*$ix).0;
15 let ix2 = (*$ix).1;
16 *$out = (*$source).index((ix1 - 1, ix2 - 1)).clone()
17 }
18 };}
19macro_rules! access_1d_slice {
20 ($source:expr, $ix:expr, $out:expr) => {
21 unsafe {
22 for i in 0..(*$ix).len() {
23 (*$out)[i] = (*$source).index((*$ix)[i] - 1).clone();
24 }
25 }};}
26
27macro_rules! access_1d_slice_bool {
28 ($source:expr, $ix:expr, $out:expr) => {
29 unsafe {
30 let mut j = 0;
31 let out_len = (*$out).len();
32 for i in 0..(*$ix).len() {
33 if (*$ix)[i] == true {
34 j += 1;
35 }
36 }
37 if j != out_len {
38 (*$out).resize_vertically_mut(j, (*$out)[0]);
39 }
40 j = 0;
41 for i in 0..(*$source).len() {
42 if (*$ix)[i] == true {
43 (*$out)[j] = (*$source).index(i).clone();
44 j += 1;
45 }
46 }
47 }};}
48
49macro_rules! access_1d_slice_bool_v {
50 ($source:expr, $ix:expr, $out:expr) => {
51 unsafe {
52 let mut j = 0;
53 let out_len = (*$out).len();
54 for i in 0..(*$ix).len() {
55 if (*$ix)[i] == true {
56 j += 1;
57 }
58 }
59 if j != out_len {
60 (*$out).resize_vertically_mut(j, (*$out)[0]);
61 }
62 j = 0;
63 for i in 0..(*$source).len() {
64 if (*$ix)[i] == true {
65 (*$out)[j] = (*$source).index(i).clone();
66 j += 1;
67 }
68 }
69 }};}
70
71macro_rules! access_2d_row_slice_bool {
72 ($source:expr, $ix:expr, $out:expr) => {
73 unsafe {
74 let scalar_ix = &(*$ix).0;
75 let vec_ix = &(*$ix).1;
76 let mut j = 0;
77 let out_len = (*$out).len();
78 for i in 0..vec_ix.len() {
79 if vec_ix[i] == true {
80 j += 1;
81 }
82 }
83 if j != out_len {
84 (*$out).resize_horizontally_mut(j, (*$out)[0]);
85 }
86 j = 0;
87 for i in 0..vec_ix.len() {
88 if vec_ix[i] == true {
89 (*$out)[j] = (*$source).index((scalar_ix - 1, i)).clone();
90 j += 1;
91 }
92 }
93 }};}
94
95macro_rules! access_2d_col_slice_bool {
96 ($source:expr, $ix:expr, $out:expr) => {
97 unsafe {
98 let vec_ix = &(*$ix).0;
99 let scalar_ix = &(*$ix).1;
100 let mut j = 0;
101 let out_len = (*$out).len();
102 for i in 0..vec_ix.len() {
103 if vec_ix[i] == true {
104 j += 1;
105 }
106 }
107 if j != out_len {
108 (*$out).resize_vertically_mut(j, (*$out)[0]);
109 }
110 j = 0;
111 for i in 0..vec_ix.len() {
112 if vec_ix[i] == true {
113 (*$out)[j] = (*$source).index((i, scalar_ix - 1)).clone();
114 j += 1;
115 }
116 }
117 }};}
118
119macro_rules! access_2d_slice {
120 ($source:expr, $ix:expr, $out:expr) => {
121 unsafe {
122 let nrows = (*$ix).0.len();
123 let ncols = (*$ix).1.len();
124 let mut out_ix = 0;
125 for j in 0..ncols {
126 for i in 0..nrows {
127 (*$out)[out_ix] = (*$source).index(((*$ix).0[i] - 1, (*$ix).1[j] - 1)).clone();
128 out_ix += 1;
129 }
130 }
131 }};}
132
133macro_rules! access_2d_slice_bool {
134 ($source:expr, $ix:expr, $out:expr) => {
135 unsafe {
136 let ix1 = &(*$ix).0;
137 let ix2 = &(*$ix).1;
138 let mut j = 0;
139 let out_len = (*$out).len();
140 for i in 0..ix1.len() {
141 if ix1[i] == true {
142 j += 1;
143 }
144 }
145 if j != (*$out).nrows() {
146 (*$out).resize_vertically_mut(j, (*$out)[0]);
147 }
148 j = 0;
149 for k in 0..ix2.len() {
150 for i in 0..ix1.len() {
151 if ix1[i] == true {
152 (*$out)[j] = (*$source).index((i, ix2[k] - 1)).clone();
153 j += 1;
154 }
155 }
156 }
157 }};}
158
159macro_rules! access_2d_slice_bool2 {
160 ($source:expr, $ix:expr, $out:expr) => {
161 unsafe {
162 let ix1 = &(*$ix).0;
163 let ix2 = &(*$ix).1;
164 let mut j = 0;
165 let out_len = (*$out).len();
166 for i in 0..ix2.len() {
167 if ix2[i] == true {
168 j += 1;
169 }
170 }
171 if j != (*$out).ncols() {
172 (*$out).resize_horizontally_mut(j, (*$out)[0]);
173 }
174 j = 0;
175 for k in 0..ix2.len() {
176 for i in 0..ix1.len() {
177 if ix2[k] == true {
178 (*$out)[j] = (*$source).index((ix1[i] - 1, k)).clone();
179 j += 1;
180 }
181 }
182 }
183 }};}
184
185macro_rules! access_2d_slice_bool_bool {
186 ($source:expr, $ix:expr, $out:expr) => {
187 unsafe {
188 let ix1 = &(*$ix).0;
189 let ix2 = &(*$ix).1;
190 let mut k = 0;
191 let mut j = 0;
192 let out_len = (*$out).len();
193 for i in 0..ix1.len() {
194 if ix1[i] == true {
195 j += 1;
196 }
197 }
198 for i in 0..ix2.len() {
199 if ix2[i] == true {
200 k += 1;
201 }
202 }
203 if j != (*$out).nrows() || k != (*$out).ncols() {
204 (*$out).resize_mut(j, k, (*$out)[0]);
205 }
206 let mut out_ix = 0;
207 for k in 0..ix2.len() {
208 for j in 0..ix1.len() {
209 if ix1[j] == true && ix2[k] == true {
210 (*$out)[out_ix] = (*$source).index((j, k)).clone();
211 out_ix += 1;
212 }
213 }
214 }
215 }};}
216
217macro_rules! access_2d_slice_all {
218 ($source:expr, $ix:expr, $out:expr) => {
219 unsafe {
220 let n_cols = (*$source).ncols();
221 let n_rows = (*$ix).nrows();
222 let mut out_ix = 0;
223 for c in 0..n_cols {
224 for r in 0..n_rows {
225 (*$out)[out_ix] = (*$source).index(((*$ix)[r] - 1, c)).clone();
226 out_ix += 1;
227 }
228 }
229 }};}
230
231macro_rules! access_2d_slice_all_bool {
232 ($source:expr, $ix:expr, $out:expr) => {
233 unsafe {
234 let vec_ix = &(*$ix);
235 let mut j = 0;
236 let out_len = (*$out).len();
237 for i in 0..vec_ix.len() {
238 if vec_ix[i] == true {
239 j += 1;
240 }
241 }
242 if j != out_len {
243 (*$out).resize_vertically_mut(j, (*$out)[0]);
244 }
245 j = 0;
246 for i in 0..vec_ix.len() {
247 for k in 0..(*$source).ncols() {
248 if vec_ix[i] == true {
249 (*$out)[j] = (*$source).index((i, k)).clone();
250 j += 1;
251 }
252 }
253 }
254 }};}
255
256macro_rules! access_2d_all_slice_bool {
257 ($source:expr, $ix:expr, $out:expr) => {
258 unsafe {
259 let vec_ix = &(*$ix);
260 let mut j = 0;
261 let out_len = (*$out).len();
262 for i in 0..vec_ix.len() {
263 if vec_ix[i] == true {
264 j += 1;
265 }
266 }
267 if j != out_len {
268 (*$out).resize_horizontally_mut(j, (*$out)[0]);
269 }
270 j = 0;
271 for k in 0..(*$source).nrows() {
272 for i in 0..vec_ix.len() {
273 if vec_ix[i] == true {
274 (*$out)[j] = (*$source).index((k, i)).clone();
275 j += 1;
276 }
277 }
278 }
279 }};}
280
281macro_rules! access_2d_all_slice {
282 ($source:expr, $ix:expr, $out:expr) => {
283 unsafe {
284 let n_rows = (*$source).nrows();
285 let n_cols = (*$ix).nrows();
286 let mut out_ix = 0;
287 for c in 0..n_cols {
288 for r in 0..n_rows {
289 (*$out)[out_ix] = (*$source).index((r, (*$ix)[c] - 1)).clone();
290 out_ix += 1;
291 }
292 }
293 }};}
294
295macro_rules! access_2d_row_slice {
296 ($source:expr, $ix:expr, $out:expr) => {
297 unsafe {
298 let ix1 = &(*$ix).0;
299 let ix2 = &(*$ix).1;
300 let out_cols = ix2.nrows();
301 let mut out_ix = 0;
302 for c in 0..out_cols {
303 (*$out)[out_ix] = (*$source).index((ix1 - 1, ix2[c] - 1)).clone();
304 out_ix += 1;
305 }
306 }};}
307
308macro_rules! access_2d_col_slice {
309 ($source:expr, $ix:expr, $out:expr) => {
310 unsafe {
311 let ix1 = &(*$ix).0;
312 let ix2 = &(*$ix).1;
313 let out_rows = ix1.nrows();
314 let mut out_ix = 0;
315 for c in 0..out_rows {
316 (*$out)[out_ix] = (*$source).index((ix1[c] - 1, ix2 - 1)).clone();
317 out_ix += 1;
318 }
319 }};}
320
321macro_rules! access_col {
322 ($source:expr, $ix:expr, $out:expr) => {
323 unsafe {
324 for i in 0..(*$source).nrows() {
325 (*$out)[i] = (*$source).index((i, *$ix - 1)).clone();
326 }
327 }};}
328
329macro_rules! access_row {
330 ($source:expr, $ix:expr, $out:expr) => {
331 unsafe {
332 for i in 0..(*$source).nrows() {
333 (*$out)[i] = (*$source).index((*$ix - 1, i)).clone();
334 }
335 }};}
336
337macro_rules! access_1d_all {
338 ($source:expr, $ix:expr, $out:expr) => {
339 unsafe {
340 for i in 0..(*$source).len() {
341 (*$out)[i] = (*$source).index(i).clone();
342 }
343 }};}
344
345macro_rules! impl_access_fxn {
346 ($struct_name:ident, $arg_type:ty, $ix_type:ty, $out_type:ty, $op:ident) => {
347 #[derive(Debug)]
348 struct $struct_name<T> {
349 source: Ref<$arg_type>,
350 ixes: Ref<$ix_type>,
351 out: Ref<$out_type>,
352 }
353 impl<T> MechFunction for $struct_name<T>
354 where
355 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
356 Ref<$out_type>: ToValue
357 {
358 fn solve(&self) {
359 let source_ptr = self.source.as_ptr();
360 let ixes_ptr = self.ixes.as_ptr();
361 let out_ptr = self.out.as_ptr();
362 $op!(source_ptr,ixes_ptr,out_ptr);
363 }
364 fn out(&self) -> Value { self.out.to_value() }
365 fn to_string(&self) -> String { format!("{:#?}", self) }
366 }};}
367
368macro_rules! impl_access_fxn_shape {
369 ($name:ident, $ix_type:ty, $out_type:ty, $fxn:ident) => {
370 paste!{
371 #[cfg(feature = "Matrix1")]
372 impl_access_fxn!([<$name M1>], Matrix1<T>, $ix_type, $out_type, $fxn);
373 #[cfg(feature = "Matrix2")]
374 impl_access_fxn!([<$name M2>], Matrix2<T>, $ix_type, $out_type, $fxn);
375 #[cfg(feature = "Matrix3")]
376 impl_access_fxn!([<$name M3>], Matrix3<T>, $ix_type, $out_type, $fxn);
377 #[cfg(feature = "Matrix4")]
378 impl_access_fxn!([<$name M4>], Matrix4<T>, $ix_type, $out_type, $fxn);
379 #[cfg(feature = "Matrix2x3")]
380 impl_access_fxn!([<$name M2x3>], Matrix2x3<T>, $ix_type, $out_type, $fxn);
381 #[cfg(feature = "Matrix3x2")]
382 impl_access_fxn!([<$name M3x2>], Matrix3x2<T>, $ix_type, $out_type, $fxn);
383 #[cfg(feature = "MatrixD")]
384 impl_access_fxn!([<$name MD>], DMatrix<T>, $ix_type, $out_type, $fxn);
385 #[cfg(feature = "Vector2")]
386 impl_access_fxn!([<$name V2>], Vector2<T>, $ix_type, $out_type, $fxn);
387 #[cfg(feature = "Vector3")]
388 impl_access_fxn!([<$name V3>], Vector3<T>, $ix_type, $out_type, $fxn);
389 #[cfg(feature = "Vector4")]
390 impl_access_fxn!([<$name V4>], Vector4<T>, $ix_type, $out_type, $fxn);
391 #[cfg(feature = "VectorD")]
392 impl_access_fxn!([<$name VD>], DVector<T>, $ix_type, $out_type, $fxn);
393 #[cfg(feature = "RowVector2")]
394 impl_access_fxn!([<$name R2>], RowVector2<T>, $ix_type, $out_type, $fxn);
395 #[cfg(feature = "RowVector3")]
396 impl_access_fxn!([<$name R3>], RowVector3<T>, $ix_type, $out_type, $fxn);
397 #[cfg(feature = "RowVector4")]
398 impl_access_fxn!([<$name R4>], RowVector4<T>, $ix_type, $out_type, $fxn);
399 #[cfg(feature = "RowVectorD")]
400 impl_access_fxn!([<$name RD>], RowDVector<T>, $ix_type, $out_type, $fxn);
401 }
402 };}
403
404impl_access_fxn_shape!(Access1DS, usize, T, access_1d);
406
407impl_access_fxn_shape!(Access2DSS, (usize,usize), T, access_2d);
409
410impl_access_fxn_shape!(Access1DVD, DVector<usize>, DVector<T>, access_1d_slice);
412impl_access_fxn_shape!(Access1DVDb, DVector<bool>, DVector<T>, access_1d_slice_bool_v);
413
414impl_access_fxn_shape!(Access2DVDVD, (DVector<usize>,DVector<usize>), DMatrix<T>, access_2d_slice);
416impl_access_fxn_shape!(Access2DVDbVD, (DVector<bool>,DVector<usize>), DMatrix<T>, access_2d_slice_bool);
417impl_access_fxn_shape!(Access2DVDVDb, (DVector<usize>,DVector<bool>), DMatrix<T>, access_2d_slice_bool2);
418impl_access_fxn_shape!(Access2DVDbVDb, (DVector<bool>,DVector<bool>), DMatrix<T>, access_2d_slice_bool_bool);
419
420impl_access_fxn_shape!(Access1DA, Value, DVector<T>, access_1d_all);
422
423impl_access_fxn_shape!(Access2DAS, usize, DVector<T>, access_col);
425
426impl_access_fxn_shape!(Access2DSA, usize, RowDVector<T>, access_row);
428
429impl_access_fxn_shape!(Access2DVDA, DVector<usize>, DMatrix<T>, access_2d_slice_all);
431impl_access_fxn_shape!(Access2DVDbA, DVector<bool>, DMatrix<T>, access_2d_slice_all_bool);
432
433impl_access_fxn_shape!(Access2DAVD, DVector<usize>, DMatrix<T>, access_2d_all_slice);
435impl_access_fxn_shape!(Access2DAVDb, DVector<bool>, DMatrix<T>, access_2d_all_slice_bool);
436
437impl_access_fxn_shape!(Access2DSVD, (usize, DVector<usize>), RowDVector<T>, access_2d_row_slice);
439impl_access_fxn_shape!(Access2DSVDb, (usize, DVector<bool>), RowDVector<T>, access_2d_row_slice_bool);
440
441impl_access_fxn_shape!(Access2DVDS, (DVector<usize>, usize), DVector<T>, access_2d_col_slice);
443impl_access_fxn_shape!(Access2DVDbS, (DVector<bool>, usize), DVector<T>, access_2d_col_slice_bool);
444
445macro_rules! impl_access_match_arms {
446 ($fxn_name:ident,$macro_name:ident, $arg:expr) => {
447 paste!{
448 [<impl_access_ $macro_name _match_arms>]!(
449 $fxn_name,
450 $arg,
451 Bool => MatrixBool, bool, false, "Bool";
452 I8 => MatrixI8, i8, i8::zero(), "I8";
453 I16 => MatrixI16, i16, i16::zero(), "I16";
454 I32 => MatrixI32, i32, i32::zero(), "I32";
455 I64 => MatrixI64, i64, i64::zero(), "I64";
456 I128 => MatrixI128, i128, i128::zero(), "I128";
457 U8 => MatrixU8, u8, u8::zero(), "U8";
458 U16 => MatrixU16, u16, u16::zero(), "U16";
459 U32 => MatrixU32, u32, u32::zero(), "U32";
460 U64 => MatrixU64, u64, u64::zero(), "U64";
461 U128 => MatrixU128, u128, u128::zero(), "U128";
462 F32 => MatrixF32, F32, F32::zero(), "F32";
463 F64 => MatrixF64, F64, F64::zero(), "F64";
464 )
465 }
466 }
467}
468
469macro_rules! impl_access_scalar_match_arms {
472 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
473 paste!{
474 match $arg {
475 $(
476 $(
477 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
478 (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R4>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
479 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
480 (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R3>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
481 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
482 (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R2>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
483 #[cfg(all(feature = $value_string, feature = "Vector4"))]
484 (Value::$matrix_kind(Matrix::Vector4(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V4>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
485 #[cfg(all(feature = $value_string, feature = "Vector3"))]
486 (Value::$matrix_kind(Matrix::Vector3(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V3>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
487 #[cfg(all(feature = $value_string, feature = "Vector2"))]
488 (Value::$matrix_kind(Matrix::Vector2(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V2>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
489 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
490 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M4>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
491 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
492 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M3>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
493 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
494 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M2>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
495 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
496 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M1>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
497 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
498 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M2x3>]{source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
499 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
500 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M3x2>]{source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
501 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
502 (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name RD>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
503 #[cfg(all(feature = $value_string, feature = "VectorD"))]
504 (Value::$matrix_kind(Matrix::DVector(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name VD>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
505 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
506 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name MD>] {source: input.clone(), ixes: ix.clone(), out: new_ref($default) })),
507 )+
508 )+
509 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
510 }
511 }
512 }
513}
514
515fn impl_access_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
516 impl_access_match_arms!(Access1DS, scalar, (lhs_value, ixes.as_slice()))
517}
518
519pub struct MatrixAccessScalar {}
520impl NativeFunctionCompiler for MatrixAccessScalar {
521 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
522 if arguments.len() <= 1 {
523 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
524 }
525 let ixes = arguments.clone().split_off(1);
526 let mat = arguments[0].clone();
527 match impl_access_scalar_fxn(mat.clone(), ixes.clone()) {
528 Ok(fxn) => Ok(fxn),
529 Err(_) => {
530 match (mat,ixes) {
531 (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
532 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
533 }
534 }
535 }
536 }
537}
538
539macro_rules! impl_access_scalar_scalar_match_arms {
542 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
543 paste!{
544 match $arg {
545 $(
546 $(
547 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
548 (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R4>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
549 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
550 (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R3>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
551 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
552 (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R2>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
553 #[cfg(all(feature = $value_string, feature = "Vector4"))]
554 (Value::$matrix_kind(Matrix::Vector4(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V4>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
555 #[cfg(all(feature = $value_string, feature = "Vector3"))]
556 (Value::$matrix_kind(Matrix::Vector3(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V3>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
557 #[cfg(all(feature = $value_string, feature = "Vector2"))]
558 (Value::$matrix_kind(Matrix::Vector2(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V2>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
559 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
560 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M4>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
561 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
562 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M3>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
563 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
564 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M2>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
565 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
566 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M2x3>]{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
567 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
568 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M3x2>]{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
569 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
570 (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name RD>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
571 #[cfg(all(feature = $value_string, feature = "VectorD"))]
572 (Value::$matrix_kind(Matrix::DVector(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name VD>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
573 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
574 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name MD>] {source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref($default) })),
575 )+
576 )+
577 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: 315, kind: MechErrorKind::UnhandledFunctionArgumentKind }),
578 }
579 }
580 }
581}
582
583fn impl_access_scalar_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
584 impl_access_match_arms!(Access2DSS, scalar_scalar, (lhs_value, ixes.as_slice()))
585}
586
587pub struct MatrixAccessScalarScalar {}
588impl NativeFunctionCompiler for MatrixAccessScalarScalar {
589 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
590 if arguments.len() <= 2 {
591 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
592 }
593 let ixes = arguments.clone().split_off(1);
594 let mat = arguments[0].clone();
595 match impl_access_scalar_scalar_fxn(mat.clone(), ixes.clone()) {
596 Ok(fxn) => Ok(fxn),
597 Err(_) => {
598 match (mat,ixes) {
599 (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
600 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
601 }
602 }
603 }
604 }
605}
606
607macro_rules! impl_access_range_match_arms {
610 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
611 paste!{
612 match $arg {
613 $(
614 $(
615 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
616 (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbR4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
617 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
618 (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbR3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
619 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
620 (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbR2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
621 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
622 (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbRD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
623
624 #[cfg(all(feature = $value_string, feature = "Vector4"))]
627 (Value::$matrix_kind(Matrix::Vector4(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbV4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
628 #[cfg(all(feature = $value_string, feature = "Vector3"))]
629 (Value::$matrix_kind(Matrix::Vector3(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbV3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
630 #[cfg(all(feature = $value_string, feature = "Vector2"))]
631 (Value::$matrix_kind(Matrix::Vector2(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbV2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
632 #[cfg(all(feature = $value_string, feature = "VectorD"))]
633 (Value::$matrix_kind(Matrix::DVector(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbVD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
634
635 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
638 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
639 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
640 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
641 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
642 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
643 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
644 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM1{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
645 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
646 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
647 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
648 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
649 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
650 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDbMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
651
652 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
655 (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDR4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
656 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
657 (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDR3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
658 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
659 (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDR2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
660 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
661 (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDRD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
662
663 #[cfg(all(feature = $value_string, feature = "Vector4"))]
666 (Value::$matrix_kind(Matrix::Vector4(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDV4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
667 #[cfg(all(feature = $value_string, feature = "Vector3"))]
668 (Value::$matrix_kind(Matrix::Vector3(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDV3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
669 #[cfg(all(feature = $value_string, feature = "Vector2"))]
670 (Value::$matrix_kind(Matrix::Vector2(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDV2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
671 #[cfg(all(feature = $value_string, feature = "VectorD"))]
672 (Value::$matrix_kind(Matrix::DVector(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDVD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
673
674 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
677 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
678 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
679 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
680 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
681 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
682 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
683 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM1{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
684 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
685 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
686 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
687 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
688 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
689 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(ix.borrow().len(),$default)) })),
690 )+
691 )+
692 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
693 }
694 }
695 }
696}
697
698fn impl_access_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
699 impl_access_match_arms!(Access1DR, range, (lhs_value, ixes.as_slice()))
700}
701
702pub struct MatrixAccessRange {}
703impl NativeFunctionCompiler for MatrixAccessRange {
704 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
705 if arguments.len() <= 1 {
706 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
707 }
708 let ixes = arguments.clone().split_off(1);
709 let mat = arguments[0].clone();
710 match impl_access_range_fxn(mat.clone(), ixes.clone()) {
711 Ok(fxn) => Ok(fxn),
712 Err(_) => {
713 match (mat,ixes) {
714 (Value::MutableReference(lhs),rhs_value) => { impl_access_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
715 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
716 }
717 }
718 }
719 }
720}
721
722macro_rules! impl_access_range_range_match_arms {
725 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
726 paste!{
727 match $arg {
728 $(
729 $(
730 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
731 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
732 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
733 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
734 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
735 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
736 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
737 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM1{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
738 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
739 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
740 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
741 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
742 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
743 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
744
745 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
746 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
747 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
748 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
749 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
750 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
751 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
752 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM1{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
753 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
754 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
755 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
756 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
757 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
758 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
759
760 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
761 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
762 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
763 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
764 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
765 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
766 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
767 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM1{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
768 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
769 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
770 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
771 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
772 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
773 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
774
775 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
776 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
777 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
778 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
779 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
780 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
781 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
782 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM1{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
783 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
784 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
785 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
786 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
787 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
788 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
789 )+
790 )+
791 (lhs_value, ixes) => {
793 match impl_access_range_scalar_fxn(lhs_value.clone(), ixes.to_vec()) {
794 Ok(res) => Ok(res),
795 Err(_) => impl_access_scalar_range_fxn(lhs_value, ixes.to_vec()),
796 }
797 }
798 }
799 }
800 }
801}
802
803fn impl_access_range_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
804 impl_access_match_arms!(Access2DRR, range_range, (lhs_value, ixes.as_slice()))
805}
806
807pub struct MatrixAccessRangeRange {}
808impl NativeFunctionCompiler for MatrixAccessRangeRange {
809 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
810 if arguments.len() <= 2 {
811 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
812 }
813 let ixes = arguments.clone().split_off(1);
814 let mat = arguments[0].clone();
815 match impl_access_range_range_fxn(mat.clone(), ixes.clone()) {
816 Ok(fxn) => Ok(fxn),
817 Err(_) => {
818 match (mat,ixes) {
819 (Value::MutableReference(lhs),rhs_value) => { impl_access_range_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
820 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
821 }
822 }
823 }
824 }
825}
826
827macro_rules! impl_access_all_match_arms {
830 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
831 paste!{
832 match $arg {
833 $(
834 $(
835 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
836 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAM4 {source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
837 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
838 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAM3 {source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
839 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
840 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAM2 {source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
841 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
842 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAM3x2{source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
843 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
844 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAM2x3{source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
845 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
846 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll]) => Ok(Box::new(Access1DAMD {source: input.clone(), ixes: new_ref(Value::IndexAll), out: new_ref(DVector::from_element(input.borrow().len(),$default)) })),
847 )+
848 )+
849 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
850 }
851 }
852 }
853}
854
855fn impl_access_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
856 impl_access_match_arms!(Access1DA, all, (lhs_value, ixes.as_slice()))
857}
858
859pub struct MatrixAccessAll {}
860impl NativeFunctionCompiler for MatrixAccessAll {
861 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
862 if arguments.len() <= 1 {
863 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
864 }
865 let ixes = arguments.clone().split_off(1);
866 let mat = arguments[0].clone();
867 match impl_access_all_fxn(mat.clone(), ixes.clone()) {
868 Ok(fxn) => Ok(fxn),
869 Err(_) => {
870 match (mat,ixes) {
871 (Value::MutableReference(lhs),rhs_value) => { impl_access_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
872 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
873 }
874 }
875 }
876 }
877}
878
879macro_rules! impl_access_all_scalar_match_arms {
882 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
883 paste!{
884 match $arg {
885 $(
886 $(
887 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
888 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM4 {source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
889 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
890 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM2 {source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
891 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
892 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM3 {source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
893 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
894 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
895 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
896 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
897 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
898 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASMD {source: input.clone(), ixes: ix.clone(), out: new_ref(DVector::from_element(input.borrow().nrows(),$default)) })),
899 )+
900 )+
901 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
902 }
903 }
904 }
905}
906
907fn impl_access_all_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
908 impl_access_match_arms!(Access2DAS, all_scalar, (lhs_value, ixes.as_slice()))
909}
910
911pub struct MatrixAccessAllScalar {}
912impl NativeFunctionCompiler for MatrixAccessAllScalar {
913 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
914 if arguments.len() <= 2 {
915 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
916 }
917 let ixes = arguments.clone().split_off(1);
918 let mat = arguments[0].clone();
919 match impl_access_all_scalar_fxn(mat.clone(), ixes.clone()) {
920 Ok(fxn) => Ok(fxn),
921 Err(_) => {
922 match (mat,ixes) {
923 (Value::MutableReference(lhs),rhs_value) => { impl_access_all_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
924 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
925 }
926 }
927 }
928 }
929}
930
931macro_rules! impl_access_scalar_all_match_arms {
934 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
935 paste!{
936 match $arg {
937 $(
938 $(
939 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
940 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM4{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
941 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
942 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM3{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
943 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
944 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM2{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
945 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
946 (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM1{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
947 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
948 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
949 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
950 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
951 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
952 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAMD{source: input.clone(), ixes: ix.clone(), out: new_ref(RowDVector::from_element(input.borrow().nrows(),$default)) })),
953 )+
954 )+
955 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
956 }
957 }
958 }
959}
960
961fn impl_access_scalar_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
962 impl_access_match_arms!(Access2DSA, scalar_all, (lhs_value, ixes.as_slice()))
963}
964
965pub struct MatrixAccessScalarAll {}
966impl NativeFunctionCompiler for MatrixAccessScalarAll {
967 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
968 if arguments.len() <= 2 {
969 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
970 }
971 let ixes = arguments.clone().split_off(1);
972 let mat = arguments[0].clone();
973 match impl_access_scalar_all_fxn(mat.clone(), ixes.clone()) {
974 Ok(fxn) => Ok(fxn),
975 Err(_) => {
976 match (mat,ixes) {
977 (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
978 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
979 }
980 }
981 }
982 }
983}
984
985macro_rules! impl_access_all_range_match_arms {
988 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
989 paste!{
990 match $arg {
991 $(
992 $(
993 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
995 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
996 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
997 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
998 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
999 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1000 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1001 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1002 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1003 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1004 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1005 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1006 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1008 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1009 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1010 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1011 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1012 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1013 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1014 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1015 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1016 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1017 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1018 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1019 )+
1020 )+
1021 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1022 }
1023 }
1024 }
1025}
1026
1027fn impl_access_all_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1028 impl_access_match_arms!(Access2DAR, all_range, (lhs_value, ixes.as_slice()))
1029}
1030
1031pub struct MatrixAccessAllRange {}
1032impl NativeFunctionCompiler for MatrixAccessAllRange {
1033 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1034 if arguments.len() <= 2 {
1035 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1036 }
1037 let ixes = arguments.clone().split_off(1);
1038 let mat = arguments[0].clone();
1039 match impl_access_all_range_fxn(mat.clone(), ixes.clone()) {
1040 Ok(fxn) => Ok(fxn),
1041 Err(_) => {
1042 match (mat,ixes) {
1043 (Value::MutableReference(lhs),rhs_value) => { impl_access_all_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1044 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1045 }
1046 }
1047 }
1048 }
1049}
1050
1051macro_rules! impl_access_range_all_match_arms {
1054 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1055 paste!{
1056 match $arg {
1057 $(
1058 $(
1059 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1061 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1062 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1063 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1064 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1065 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1066 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1067 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1068 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1069 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1070 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1071 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1072 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1074 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM4{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1075 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1076 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1077 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1078 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1079 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1080 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM3x2{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1081 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1082 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM2x3{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1083 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1084 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAMD{source: input.clone(), ixes: ix.clone(), out: new_ref(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1085 )+
1086 )+
1087 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1088 }
1089 }
1090 }
1091}
1092
1093fn impl_access_range_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1094 impl_access_match_arms!(Access2DRA, range_all, (lhs_value, ixes.as_slice()))
1095}
1096
1097pub struct MatrixAccessRangeAll {}
1098impl NativeFunctionCompiler for MatrixAccessRangeAll {
1099 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1100 if arguments.len() <= 2 {
1101 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1102 }
1103 let ixes = arguments.clone().split_off(1);
1104 let mat = arguments[0].clone();
1105 match impl_access_range_all_fxn(mat.clone(), ixes.clone()) {
1106 Ok(fxn) => Ok(fxn),
1107 Err(_) => {
1108 match (mat,ixes) {
1109 (Value::MutableReference(lhs),rhs_value) => { impl_access_range_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1110 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1111 }
1112 }
1113 }
1114 }
1115}
1116
1117macro_rules! impl_access_range_scalar_match_arms {
1120 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1121 paste!{
1122 match $arg {
1123 $(
1124 $(
1125 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1127 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1128 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1129 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1130 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1131 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1132 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1133 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1134 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1135 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1136 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1137 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1138 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1140 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1141 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1142 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1143 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1144 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1145 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1146 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1147 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1148 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1149 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1150 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(DVector::from_element(ix1.borrow().len(),$default)) })),
1151 )+
1152 )+
1153 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1154 }
1155 }
1156 }
1157}
1158
1159fn impl_access_range_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1160 impl_access_match_arms!(Access2DRS, range_scalar, (lhs_value, ixes.as_slice()))
1161}
1162
1163pub struct MatrixAccessRangeScalar {}
1164impl NativeFunctionCompiler for MatrixAccessRangeScalar {
1165 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1166 if arguments.len() <= 2 {
1167 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1168 }
1169 let ixes = arguments.clone().split_off(1);
1170 let mat = arguments[0].clone();
1171 match impl_access_range_scalar_fxn(mat.clone(), ixes.clone()) {
1172 Ok(fxn) => Ok(fxn),
1173 Err(_) => {
1174 match (mat,ixes) {
1175 (Value::MutableReference(lhs),rhs_value) => { impl_access_range_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1176 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1177 }
1178 }
1179 }
1180 }
1181}
1182
1183macro_rules! impl_access_scalar_range_match_arms {
1186 ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1187 paste!{
1188 match $arg {
1189 $(
1190 $(
1191 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1193 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1194 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1195 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1196 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1197 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1198 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1199 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1200 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1201 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1202 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1203 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1204 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1206 (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM4{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1207 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1208 (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1209 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1210 (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1211 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1212 (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM3x2{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1213 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1214 (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM2x3{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1215 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1216 (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbMD{source: input.clone(), ixes: new_ref((ix1.borrow().clone(),ix2.borrow().clone())), out: new_ref(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1217 )+
1218 )+
1219 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1220 }
1221 }
1222 }
1223}
1224
1225fn impl_access_scalar_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1226 impl_access_match_arms!(Access2DSR, scalar_range, (lhs_value, ixes.as_slice()))
1227}
1228
1229pub struct MatrixAccessScalarRange {}
1230
1231impl NativeFunctionCompiler for MatrixAccessScalarRange {
1232 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1233 if arguments.len() <= 2 {
1234 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1235 }
1236 let ixes = arguments.clone().split_off(1);
1237 let mat = arguments[0].clone();
1238 match impl_access_scalar_range_fxn(mat.clone(), ixes.clone()) {
1239 Ok(fxn) => Ok(fxn),
1240 Err(_) => {
1241 match (mat,ixes) {
1242 (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1243 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1244 }
1245 }
1246 }
1247 }
1248}