mech_interpreter/stdlib/access/
matrix.rs

1#[macro_use]
2use crate::stdlib::*;
3
4// Access ---------------------------------------------------------------------
5
6macro_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
404// x[1]
405impl_access_fxn_shape!(Access1DS, usize, T, access_1d);
406
407// x[1,2]
408impl_access_fxn_shape!(Access2DSS, (usize,usize), T, access_2d);
409
410// x[1..3]
411impl_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
414// x[1..3,1..3]
415impl_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
420// x[:]
421impl_access_fxn_shape!(Access1DA, Value, DVector<T>, access_1d_all);
422
423// x[:,1]
424impl_access_fxn_shape!(Access2DAS, usize, DVector<T>, access_col);
425
426// x[1,:]
427impl_access_fxn_shape!(Access2DSA, usize, RowDVector<T>, access_row);
428
429// x[1..3,:]
430impl_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
433// x[:,1..3]
434impl_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
437// x[2,1..3]
438impl_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
441// x[1..3,2]
442impl_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
469// x[1] -----------------------------------------------------------------------
470
471macro_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
539// x[1,2] ---------------------------------------------------------------------
540
541macro_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
607// x[1..3] --------------------------------------------------------------------
608
609macro_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            // --
625
626            #[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            // --
636
637            #[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            // --
653
654            #[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            // --
664
665            #[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            // --
675
676            #[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
722// x[1..3,1..3] ---------------------------------------------------------------
723
724macro_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        // Check other sizes
792        (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
827// x[:] -----------------------------------------------------------------------
828
829macro_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
879// x[:,2] ---------------------------------------------------------------------
880
881macro_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
931// x[2,:] ---------------------------------------------------------------------
932
933macro_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
985// x[:,1..3] ---------------------------------------------------------------------
986
987macro_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            // All Vector
994            #[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            // All Bool Vector
1007            #[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
1051// x[1..3,:] ---------------------------------------------------------------------
1052
1053macro_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            // Vector All
1060            #[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            // Bool Vector All
1073            #[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
1117// x[1..3,2] ---------------------------------------------------------------------
1118
1119macro_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            // Vector Scalar
1126            #[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            // Bool Vector Scalar
1139            #[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
1183// x[2,1..3] ---------------------------------------------------------------------
1184
1185macro_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            // Vector Scalar
1192            #[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            // Bool Vector Scalar
1205            #[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}