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        ((&mut *$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].clone());
39      }
40      j = 0;
41      for i in 0..(*$source).len() {
42        if (*$ix)[i] == true {
43          (&mut (*$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].clone());
61      }
62      j = 0;
63      for i in 0..(*$source).len() {
64        if (&(*$ix))[i] == true {
65          (&mut (*$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].clone());
85      }
86      j = 0;
87      for i in 0..vec_ix.len() {
88        if vec_ix[i] == true {
89          (&mut (*$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].clone());
109      }
110      j = 0;
111      for i in 0..vec_ix.len() {
112        if vec_ix[i] == true {
113          (&mut (*$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          (&mut (*$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].clone());
147      }
148      j = 0;
149      for k in 0..ix2.len() {
150        for i in 0..ix1.len() {
151          if ix1[i] == true {
152            (&mut (*$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].clone());
173      }
174      j = 0;
175      for k in 0..ix2.len() {
176        for i in 0..ix1.len() {
177          if ix2[k] == true {
178            (&mut (*$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].clone());
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            (&mut (*$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          (&mut (*$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, (&mut (*$out))[0].clone());
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            (&mut (*$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, (&mut (*$out))[0].clone());
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            (&mut (*$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          (&mut (*$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        (&mut (*$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        (&mut (*$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        (&mut (*$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).ncols() {
333        (&mut (*$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        (&mut (*$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> MechFunctionImpl for $struct_name<T>
354    where
355      T: 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_mut_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    #[cfg(feature = "compiler")]
368    impl<T> MechFunctionCompiler for $struct_name<T> {
369      fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
370        todo!();
371      }
372    }};}
373
374macro_rules! impl_access_fxn_shape {
375  ($name:ident, $ix_type:ty, $out_type:ty, $fxn:ident) => {
376    paste!{
377      #[cfg(feature = "matrix1")]
378      impl_access_fxn!([<$name M1>],   Matrix1<T>,    $ix_type, $out_type, $fxn);
379      #[cfg(feature = "matrix2")]
380      impl_access_fxn!([<$name M2>],   Matrix2<T>,    $ix_type, $out_type, $fxn);
381      #[cfg(feature = "matrix3")]
382      impl_access_fxn!([<$name M3>],   Matrix3<T>,    $ix_type, $out_type, $fxn);
383      #[cfg(feature = "matrix4")]
384      impl_access_fxn!([<$name M4>],   Matrix4<T>,    $ix_type, $out_type, $fxn);
385      #[cfg(feature = "matrix2x3")]
386      impl_access_fxn!([<$name M2x3>], Matrix2x3<T>,  $ix_type, $out_type, $fxn);
387      #[cfg(feature = "matrix3x2")]
388      impl_access_fxn!([<$name M3x2>], Matrix3x2<T>,  $ix_type, $out_type, $fxn);
389      #[cfg(feature = "matrixd")]
390      impl_access_fxn!([<$name MD>],   DMatrix<T>,    $ix_type, $out_type, $fxn);
391      #[cfg(feature = "vector2")]
392      impl_access_fxn!([<$name V2>],   Vector2<T>,    $ix_type, $out_type, $fxn);
393      #[cfg(feature = "vector3")]
394      impl_access_fxn!([<$name V3>],   Vector3<T>,    $ix_type, $out_type, $fxn);
395      #[cfg(feature = "vector4")]
396      impl_access_fxn!([<$name V4>],   Vector4<T>,    $ix_type, $out_type, $fxn);
397      #[cfg(feature = "vectord")]
398      impl_access_fxn!([<$name VD>],   DVector<T>,    $ix_type, $out_type, $fxn);
399      #[cfg(feature = "row_vector2")]
400      impl_access_fxn!([<$name R2>],   RowVector2<T>, $ix_type, $out_type, $fxn);
401      #[cfg(feature = "row_vector3")]
402      impl_access_fxn!([<$name R3>],   RowVector3<T>, $ix_type, $out_type, $fxn);
403      #[cfg(feature = "row_vector4")]
404      impl_access_fxn!([<$name R4>],   RowVector4<T>, $ix_type, $out_type, $fxn);
405      #[cfg(feature = "row_vectord")]
406      impl_access_fxn!([<$name RD>],   RowDVector<T>, $ix_type, $out_type, $fxn);
407    }
408  };}
409
410// x[1]
411impl_access_fxn_shape!(Access1DS, usize, T, access_1d);
412
413// x[1,2]
414impl_access_fxn_shape!(Access2DSS, (usize,usize), T, access_2d);
415
416// x[1..3]
417impl_access_fxn_shape!(Access1DVD, DVector<usize>, DVector<T>, access_1d_slice);
418impl_access_fxn_shape!(Access1DVDb, DVector<bool>, DVector<T>, access_1d_slice_bool_v);
419
420// x[1..3,1..3]
421impl_access_fxn_shape!(Access2DVDVD, (DVector<usize>,DVector<usize>), DMatrix<T>, access_2d_slice);
422impl_access_fxn_shape!(Access2DVDbVD, (DVector<bool>,DVector<usize>), DMatrix<T>, access_2d_slice_bool);
423impl_access_fxn_shape!(Access2DVDVDb, (DVector<usize>,DVector<bool>), DMatrix<T>, access_2d_slice_bool2);
424impl_access_fxn_shape!(Access2DVDbVDb, (DVector<bool>,DVector<bool>), DMatrix<T>, access_2d_slice_bool_bool);
425
426// x[:]
427impl_access_fxn_shape!(Access1DA, Value, DVector<T>, access_1d_all);
428
429// x[:,1]
430impl_access_fxn_shape!(Access2DAS, usize, DVector<T>, access_col);
431
432// x[1,:]
433#[cfg(feature = "matrix1")]
434impl_access_fxn!(Access2DSAM1,   Matrix1<T>,    usize, Matrix1<T>, access_row);
435#[cfg(feature = "matrix2")]
436impl_access_fxn!(Access2DSAM2,   Matrix2<T>,    usize, RowVector2<T>, access_row);
437#[cfg(feature = "matrix3")]
438impl_access_fxn!(Access2DSAM3,   Matrix3<T>,    usize, RowVector3<T>, access_row);
439#[cfg(feature = "matrix4")]
440impl_access_fxn!(Access2DSAM4,   Matrix4<T>,    usize, RowVector4<T>, access_row);
441#[cfg(feature = "matrix2x3")]
442impl_access_fxn!(Access2DSAM2x3, Matrix2x3<T>,  usize, RowVector3<T>, access_row);
443#[cfg(feature = "matrix3x2")]
444impl_access_fxn!(Access2DSAM3x2, Matrix3x2<T>,  usize, RowVector2<T>, access_row);
445#[cfg(feature = "matrixd")]
446impl_access_fxn!(Access2DSAMD,   DMatrix<T>,    usize, RowDVector<T>, access_row);
447
448// x[1..3,:]
449impl_access_fxn_shape!(Access2DVDA, DVector<usize>,    DMatrix<T>, access_2d_slice_all);
450impl_access_fxn_shape!(Access2DVDbA, DVector<bool>,    DMatrix<T>, access_2d_slice_all_bool);
451
452// x[:,1..3]
453impl_access_fxn_shape!(Access2DAVD, DVector<usize>,    DMatrix<T>, access_2d_all_slice);
454impl_access_fxn_shape!(Access2DAVDb, DVector<bool>,    DMatrix<T>, access_2d_all_slice_bool);
455
456// x[2,1..3]
457impl_access_fxn_shape!(Access2DSVD,  (usize, DVector<usize>),    RowDVector<T>, access_2d_row_slice);
458impl_access_fxn_shape!(Access2DSVDb, (usize, DVector<bool>),     RowDVector<T>, access_2d_row_slice_bool);
459
460// x[1..3,2]
461impl_access_fxn_shape!(Access2DVDS,  (DVector<usize>, usize),    DVector<T>, access_2d_col_slice);
462impl_access_fxn_shape!(Access2DVDbS, (DVector<bool>, usize),     DVector<T>, access_2d_col_slice_bool);
463
464macro_rules! impl_access_match_arms {
465  ($fxn_name:ident,$macro_name:ident, $arg:expr) => {
466    paste!{
467      [<impl_access_ $macro_name _match_arms>]!(
468        $fxn_name,
469        $arg,
470        Bool => MatrixBool, bool, bool::default(), "bool";
471        I8   => MatrixI8,   i8,   i8::default(),  "i8";
472        I16  => MatrixI16,  i16,  i16::default(), "i16";
473        I32  => MatrixI32,  i32,  i32::default(), "i32";
474        I64  => MatrixI64,  i64,  i64::default(), "i64";
475        I128 => MatrixI128, i128, i128::default(), "i128";
476        U8   => MatrixU8,   u8,   u8::default(), "u8";
477        U16  => MatrixU16,  u16,  u16::default(), "u16";
478        U32  => MatrixU32,  u32,  u32::default(), "u32";
479        U64  => MatrixU64,  u64,  u64::default(), "u64";
480        U128 => MatrixU128, u128, u128::default(), "u128";
481        F32  => MatrixF32,  F32,  F32::default(), "f32";
482        F64  => MatrixF64,  F64,  F64::default(), "f64";
483        String => MatrixString, String, String::default(), "string";
484        ComplexNumber => MatrixComplexNumber, ComplexNumber, ComplexNumber::default(), "complex";
485        RationalNumber => MatrixRationalNumber, RationalNumber, RationalNumber::default(), "rational";
486      )
487    }
488  }
489}
490
491// x[1] -----------------------------------------------------------------------
492
493macro_rules! impl_access_scalar_match_arms {
494  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
495    paste!{
496      match $arg {
497        $(
498          $(
499            #[cfg(all(feature = $value_string, feature = "row_vector4"))]              
500            (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R4>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
501            #[cfg(all(feature = $value_string, feature = "row_vector3"))]              
502            (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R3>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
503            #[cfg(all(feature = $value_string, feature = "row_vector2"))]              
504            (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name R2>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
505            #[cfg(all(feature = $value_string, feature = "vector4"))]              
506            (Value::$matrix_kind(Matrix::Vector4(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V4>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
507            #[cfg(all(feature = $value_string, feature = "vector3"))]              
508            (Value::$matrix_kind(Matrix::Vector3(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V3>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
509            #[cfg(all(feature = $value_string, feature = "vector2"))]              
510            (Value::$matrix_kind(Matrix::Vector2(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name V2>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
511            #[cfg(all(feature = $value_string, feature = "matrix4"))]              
512            (Value::$matrix_kind(Matrix::Matrix4(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M4>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
513            #[cfg(all(feature = $value_string, feature = "matrix3"))]              
514            (Value::$matrix_kind(Matrix::Matrix3(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M3>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
515            #[cfg(all(feature = $value_string, feature = "matrix2"))]              
516            (Value::$matrix_kind(Matrix::Matrix2(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M2>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
517            #[cfg(all(feature = $value_string, feature = "matrix1"))]              
518            (Value::$matrix_kind(Matrix::Matrix1(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M1>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
519            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]              
520            (Value::$matrix_kind(Matrix::Matrix2x3(input)),  [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M2x3>]{source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
521            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]              
522            (Value::$matrix_kind(Matrix::Matrix3x2(input)),  [Value::Index(ix)]) => Ok(Box::new([<$fxn_name M3x2>]{source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
523            #[cfg(all(feature = $value_string, feature = "row_vectord"))]              
524            (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::Index(ix)]) => Ok(Box::new([<$fxn_name RD>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
525            #[cfg(all(feature = $value_string, feature = "vectord"))]              
526            (Value::$matrix_kind(Matrix::DVector(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name VD>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
527            #[cfg(all(feature = $value_string, feature = "matrixd"))]              
528            (Value::$matrix_kind(Matrix::DMatrix(input)),    [Value::Index(ix)]) => Ok(Box::new([<$fxn_name MD>]  {source: input.clone(), ixes: ix.clone(), out: Ref::new($default) })),
529          )+
530        )+
531        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
532      }
533    }
534  }
535}
536
537fn impl_access_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
538  impl_access_match_arms!(Access1DS, scalar, (lhs_value, ixes.as_slice()))
539}
540
541pub struct MatrixAccessScalar {}
542impl NativeFunctionCompiler for MatrixAccessScalar {
543  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
544    if arguments.len() <= 1 {
545      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
546    }
547    let ixes = arguments.clone().split_off(1);
548    let mat = arguments[0].clone();
549    match impl_access_scalar_fxn(mat.clone(), ixes.clone()) {
550      Ok(fxn) => Ok(fxn),
551      Err(_) => {
552        match (mat,ixes) {
553          (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
554          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
555        }
556      }
557    }
558  }
559}
560
561// x[1,2] ---------------------------------------------------------------------
562
563macro_rules! impl_access_scalar_scalar_match_arms {
564  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
565    paste!{
566      match $arg {
567        $(
568          $(
569            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
570            (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R4>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
571            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
572            (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R3>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
573            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
574            (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name R2>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
575            #[cfg(all(feature = $value_string, feature = "vector4"))]
576            (Value::$matrix_kind(Matrix::Vector4(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V4>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
577            #[cfg(all(feature = $value_string, feature = "vector3"))]
578            (Value::$matrix_kind(Matrix::Vector3(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V3>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
579            #[cfg(all(feature = $value_string, feature = "vector2"))]
580            (Value::$matrix_kind(Matrix::Vector2(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name V2>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
581            #[cfg(all(feature = $value_string, feature = "matrix4"))]
582            (Value::$matrix_kind(Matrix::Matrix4(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M4>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
583            #[cfg(all(feature = $value_string, feature = "matrix3"))]
584            (Value::$matrix_kind(Matrix::Matrix3(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M3>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
585            #[cfg(all(feature = $value_string, feature = "matrix2"))]
586            (Value::$matrix_kind(Matrix::Matrix2(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M2>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
587            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
588            (Value::$matrix_kind(Matrix::Matrix2x3(input)),  [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M2x3>]{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
589            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
590            (Value::$matrix_kind(Matrix::Matrix3x2(input)),  [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name M3x2>]{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
591            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
592            (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name RD>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
593            #[cfg(all(feature = $value_string, feature = "vectord"))]
594            (Value::$matrix_kind(Matrix::DVector(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name VD>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
595            #[cfg(all(feature = $value_string, feature = "matrixd"))]
596            (Value::$matrix_kind(Matrix::DMatrix(input)),    [Value::Index(ix1),Value::Index(ix2)]) => Ok(Box::new([<$fxn_name MD>]  {source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new($default) })),
597          )+
598        )+
599        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: 315, kind: MechErrorKind::UnhandledFunctionArgumentKind }),
600      }
601    }
602  }
603}
604
605fn impl_access_scalar_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
606  impl_access_match_arms!(Access2DSS, scalar_scalar, (lhs_value, ixes.as_slice()))
607}
608
609pub struct MatrixAccessScalarScalar {}
610impl NativeFunctionCompiler for MatrixAccessScalarScalar {
611  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
612    if arguments.len() <= 2 {
613      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
614    }
615    let ixes = arguments.clone().split_off(1);
616    let mat = arguments[0].clone();
617    match impl_access_scalar_scalar_fxn(mat.clone(), ixes.clone()) {
618      Ok(fxn) => Ok(fxn),
619      Err(_) => {
620        match (mat,ixes) {
621          (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
622          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
623        }
624      }
625    }
626  }
627}
628
629// x[1..3] --------------------------------------------------------------------
630
631macro_rules! impl_access_range_match_arms {
632  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
633    paste!{
634      match $arg {
635        $(
636          $(
637            #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "bool"))]
638            (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::MatrixBool(Matrix::DVector(ix))])     => Ok(Box::new(Access1DVDbR4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
639            #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "bool"))]
640            (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::MatrixBool(Matrix::DVector(ix))])     => Ok(Box::new(Access1DVDbR3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
641            #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "bool"))]
642            (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::MatrixBool(Matrix::DVector(ix))])     => Ok(Box::new(Access1DVDbR2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
643            #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "bool"))]
644            (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::MatrixBool(Matrix::DVector(ix))])     => Ok(Box::new(Access1DVDbRD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
645
646            // --
647
648            #[cfg(all(feature = $value_string, feature = "vector4", feature = "bool"))]
649            (Value::$matrix_kind(Matrix::Vector4(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbV4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
650            #[cfg(all(feature = $value_string, feature = "vector3", feature = "bool"))]
651            (Value::$matrix_kind(Matrix::Vector3(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbV3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
652            #[cfg(all(feature = $value_string, feature = "vector2", feature = "bool"))]
653            (Value::$matrix_kind(Matrix::Vector2(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbV2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
654            #[cfg(all(feature = $value_string, feature = "vectord", feature = "bool"))]
655            (Value::$matrix_kind(Matrix::DVector(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbVD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
656
657            // --
658
659            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
660            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),              
661            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
662            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
663            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
664            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
665            #[cfg(all(feature = $value_string, feature = "matrix1", feature = "bool"))]
666            (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM1{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
667            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
668            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),              
669            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
670            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),              
671            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
672            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDbMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
673
674            // --
675
676            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
677            (Value::$matrix_kind(Matrix::RowVector4(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDR4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),                
678            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
679            (Value::$matrix_kind(Matrix::RowVector3(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDR3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
680            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
681            (Value::$matrix_kind(Matrix::RowVector2(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDR2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
682            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
683            (Value::$matrix_kind(Matrix::RowDVector(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDRD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
684
685            // --
686
687            #[cfg(all(feature = $value_string, feature = "vector4"))]
688            (Value::$matrix_kind(Matrix::Vector4(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDV4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),                
689            #[cfg(all(feature = $value_string, feature = "vector3"))]
690            (Value::$matrix_kind(Matrix::Vector3(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDV3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
691            #[cfg(all(feature = $value_string, feature = "vector2"))]
692            (Value::$matrix_kind(Matrix::Vector2(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDV2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
693            #[cfg(all(feature = $value_string, feature = "vectord"))]
694            (Value::$matrix_kind(Matrix::DVector(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDVD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
695
696            // --
697
698            #[cfg(all(feature = $value_string, feature = "matrix4"))]
699            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),                
700            #[cfg(all(feature = $value_string, feature = "matrix3"))]
701            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
702            #[cfg(all(feature = $value_string, feature = "matrix2"))]
703            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
704            #[cfg(all(feature = $value_string, feature = "matrix1"))]
705            (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDM1{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
706            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
707            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
708            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
709            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access1DVDM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),    
710            #[cfg(all(feature = $value_string, feature = "matrixd"))]
711            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix))])  => Ok(Box::new(Access1DVDMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(ix.borrow().len(),$default)) })),   
712          )+
713        )+
714        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
715      }
716    }
717  }
718}
719
720fn impl_access_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
721  impl_access_match_arms!(Access1DR, range, (lhs_value, ixes.as_slice()))
722}
723
724pub struct MatrixAccessRange {}
725impl NativeFunctionCompiler for MatrixAccessRange {
726  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
727    if arguments.len() <= 1 {
728      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
729    }
730    let ixes = arguments.clone().split_off(1);
731    let mat = arguments[0].clone();
732    match impl_access_range_fxn(mat.clone(), ixes.clone()) {
733      Ok(fxn) => Ok(fxn),
734      Err(_) => {
735        match (mat,ixes) {
736          (Value::MutableReference(lhs),rhs_value) => { impl_access_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
737          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
738        }
739      }
740    }
741  }
742}
743
744// x[1..3,1..3] ---------------------------------------------------------------
745
746macro_rules! impl_access_range_range_match_arms {
747  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
748    paste!{
749      match $arg {
750        $(
751          $(
752            #[cfg(all(feature = $value_string, feature = "matrix4"))]
753            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
754            #[cfg(all(feature = $value_string, feature = "matrix3"))]
755            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
756            #[cfg(all(feature = $value_string, feature = "matrix2"))]
757            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
758            #[cfg(all(feature = $value_string, feature = "matrix1"))]
759            (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM1{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
760            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
761            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
762            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
763            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
764            #[cfg(all(feature = $value_string, feature = "matrixd"))]
765            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
766
767            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
768            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
769            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
770            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
771            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
772            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
773            #[cfg(all(feature = $value_string, feature = "matrix1", feature = "bool"))]
774            (Value::$matrix_kind(Matrix::Matrix1(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM1{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
775            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
776            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
777            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
778            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
779            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
780            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
781
782            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
783            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
784            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
785            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
786            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
787            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
788            #[cfg(all(feature = $value_string, feature = "matrix1", feature = "bool"))]
789            (Value::$matrix_kind(Matrix::Matrix1(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM1{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
790            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
791            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
792            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
793            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
794            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
795            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDVDbMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
796
797            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
798            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
799            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
800            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
801            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
802            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
803            #[cfg(all(feature = $value_string, feature = "matrix1", feature = "bool"))]
804            (Value::$matrix_kind(Matrix::Matrix1(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM1{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
805            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
806            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
807            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
808            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
809            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
810            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DVDbVDbMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DMatrix::from_element(ix1.borrow().len(),ix2.borrow().len(),$default)) })),
811          )+
812        )+
813        // Check other sizes
814        (lhs_value, ixes) => {
815          match impl_access_range_scalar_fxn(lhs_value.clone(), ixes.to_vec()) {
816            Ok(res) => Ok(res),
817            Err(_) => impl_access_scalar_range_fxn(lhs_value, ixes.to_vec()),
818          }
819        }
820      }
821    }
822  }
823}
824
825fn impl_access_range_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
826  impl_access_match_arms!(Access2DRR, range_range, (lhs_value, ixes.as_slice()))
827}
828
829pub struct MatrixAccessRangeRange {}
830impl NativeFunctionCompiler for MatrixAccessRangeRange {
831  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
832    if arguments.len() <= 2 {
833      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
834    }
835    let ixes = arguments.clone().split_off(1);
836    let mat = arguments[0].clone();
837    match impl_access_range_range_fxn(mat.clone(), ixes.clone()) {
838      Ok(fxn) => Ok(fxn),
839      Err(_) => {
840        match (mat,ixes) {
841          (Value::MutableReference(lhs),rhs_value) => { impl_access_range_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
842          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
843        }
844      }
845    }
846  }
847}
848
849// x[:] -----------------------------------------------------------------------
850
851macro_rules! impl_access_all_match_arms {
852  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
853    paste!{
854      match $arg {
855        $(
856          $(
857            #[cfg(all(feature = $value_string, feature = "matrix4"))]
858            (Value::$matrix_kind(Matrix::Matrix4(input)),    [Value::IndexAll]) => Ok(Box::new(Access1DAM4  {source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
859            #[cfg(all(feature = $value_string, feature = "matrix3"))]
860            (Value::$matrix_kind(Matrix::Matrix3(input)),    [Value::IndexAll]) => Ok(Box::new(Access1DAM3  {source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
861            #[cfg(all(feature = $value_string, feature = "matrix2"))]
862            (Value::$matrix_kind(Matrix::Matrix2(input)),    [Value::IndexAll]) => Ok(Box::new(Access1DAM2  {source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
863            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
864            (Value::$matrix_kind(Matrix::Matrix3x2(input)),  [Value::IndexAll]) => Ok(Box::new(Access1DAM3x2{source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
865            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
866            (Value::$matrix_kind(Matrix::Matrix2x3(input)),  [Value::IndexAll]) => Ok(Box::new(Access1DAM2x3{source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
867            #[cfg(all(feature = $value_string, feature = "matrixd"))]
868            (Value::$matrix_kind(Matrix::DMatrix(input)),    [Value::IndexAll]) => Ok(Box::new(Access1DAMD  {source: input.clone(), ixes: Ref::new(Value::IndexAll), out: Ref::new(DVector::from_element(input.borrow().len(),$default)) })),
869          )+
870        )+
871        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
872      }
873    }
874  }
875}
876
877fn impl_access_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
878  impl_access_match_arms!(Access1DA, all, (lhs_value, ixes.as_slice()))
879}
880
881pub struct MatrixAccessAll {}
882impl NativeFunctionCompiler for MatrixAccessAll {
883  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
884    if arguments.len() <= 1 {
885      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
886    }
887    let ixes = arguments.clone().split_off(1);
888    let mat = arguments[0].clone();
889    match impl_access_all_fxn(mat.clone(), ixes.clone()) {
890      Ok(fxn) => Ok(fxn),
891      Err(_) => {
892        match (mat,ixes) {
893          (Value::MutableReference(lhs),rhs_value) => { impl_access_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
894          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
895        }
896      }
897    }
898  }
899}
900
901// x[:,2] ---------------------------------------------------------------------
902
903macro_rules! impl_access_all_scalar_match_arms {
904  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
905    paste!{
906      match $arg {
907        $(
908          $(
909            #[cfg(all(feature = $value_string, feature = "matrix4"))]
910            (Value::$matrix_kind(Matrix::Matrix4(input)),    [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM4  {source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
911            #[cfg(all(feature = $value_string, feature = "matrix3"))]
912            (Value::$matrix_kind(Matrix::Matrix3(input)),    [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM3  {source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
913            #[cfg(all(feature = $value_string, feature = "matrix2"))]
914            (Value::$matrix_kind(Matrix::Matrix2(input)),    [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM2  {source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
915            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
916            (Value::$matrix_kind(Matrix::Matrix2x3(input)),  [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
917            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
918            (Value::$matrix_kind(Matrix::Matrix3x2(input)),  [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
919            #[cfg(all(feature = $value_string, feature = "matrixd"))]
920            (Value::$matrix_kind(Matrix::DMatrix(input)),    [Value::IndexAll,Value::Index(ix)]) => Ok(Box::new(Access2DASMD  {source: input.clone(), ixes: ix.clone(), out: Ref::new(DVector::from_element(input.borrow().nrows(),$default)) })),
921          )+
922        )+
923        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
924      }
925    }
926  }
927}
928
929fn impl_access_all_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
930  impl_access_match_arms!(Access2DAS, all_scalar, (lhs_value, ixes.as_slice()))
931}
932
933pub struct MatrixAccessAllScalar {}
934impl NativeFunctionCompiler for MatrixAccessAllScalar {
935  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
936    if arguments.len() <= 2 {
937      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
938    }
939    let ixes = arguments.clone().split_off(1);
940    let mat = arguments[0].clone();
941    match impl_access_all_scalar_fxn(mat.clone(), ixes.clone()) {
942      Ok(fxn) => Ok(fxn),
943      Err(_) => {
944        match (mat,ixes) {
945          (Value::MutableReference(lhs),rhs_value) => { impl_access_all_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
946          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
947        }
948      }
949    }
950  }
951}
952
953// x[2,:] ---------------------------------------------------------------------
954
955macro_rules! impl_access_scalar_all_match_arms {
956  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
957    paste!{
958      match $arg {
959        $(
960          $(
961            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "row_vector4"))]
962            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowVector4::from_element($default)) })),
963            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "row_vector3"))]
964            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowVector3::from_element($default)) })),
965            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "row_vector2"))]
966            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowVector2::from_element($default)) })),
967            #[cfg(all(feature = $value_string, feature = "matrix1", feature = "matrix1"))]
968            (Value::$matrix_kind(Matrix::Matrix1(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM1{source: input.clone(), ixes: ix.clone(), out: Ref::new(Matrix1::from_element($default)) })),
969            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "row_vector2"))]
970            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowVector2::from_element($default)) })),
971            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "row_vector3"))]
972            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowVector3::from_element($default)) })),
973            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "row_vectord"))]
974            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::Index(ix),Value::IndexAll]) => Ok(Box::new(Access2DSAMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(RowDVector::from_element(input.borrow().ncols(),$default)) })),
975          )+
976        )+
977        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
978      }
979    }
980  }
981}
982
983fn impl_access_scalar_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
984  impl_access_match_arms!(Access2DSA, scalar_all, (lhs_value, ixes.as_slice()))
985}
986
987pub struct MatrixAccessScalarAll {}
988impl NativeFunctionCompiler for MatrixAccessScalarAll {
989  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
990    if arguments.len() <= 2 {
991      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
992    }
993    let ixes = arguments.clone().split_off(1);
994    let mat = arguments[0].clone();
995    match impl_access_scalar_all_fxn(mat.clone(), ixes.clone()) {
996      Ok(fxn) => Ok(fxn),
997      Err(_) => {
998        match (mat,ixes) {
999          (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1000          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1001        }
1002      }
1003    }
1004  }
1005}
1006
1007// x[:,1..3] ---------------------------------------------------------------------
1008
1009macro_rules! impl_access_all_range_match_arms {
1010  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1011    paste!{
1012      match $arg {
1013        $(
1014          $(
1015            // All Vector
1016            #[cfg(all(feature = $value_string, feature = "matrix4"))]
1017            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1018            #[cfg(all(feature = $value_string, feature = "matrix3"))]
1019            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1020            #[cfg(all(feature = $value_string, feature = "matrix2"))]
1021            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1022            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1023            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1024            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1025            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1026            #[cfg(all(feature = $value_string, feature = "matrixd"))]
1027            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1028            // All Bool Vector
1029            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
1030            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1031            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
1032            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1033            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
1034            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1035            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
1036            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1037            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
1038            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1039            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
1040            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))]) => Ok(Box::new(Access2DAVDbMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(input.borrow().nrows(), ix.borrow().len(),$default)) })),
1041          )+
1042        )+
1043        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1044      }
1045    }
1046  }
1047}
1048
1049fn impl_access_all_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1050  impl_access_match_arms!(Access2DAR, all_range, (lhs_value, ixes.as_slice()))
1051}
1052
1053pub struct MatrixAccessAllRange {}
1054impl NativeFunctionCompiler for MatrixAccessAllRange {
1055  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1056    if arguments.len() <= 2 {
1057      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1058    }
1059    let ixes = arguments.clone().split_off(1);
1060    let mat = arguments[0].clone();
1061    match impl_access_all_range_fxn(mat.clone(), ixes.clone()) {
1062      Ok(fxn) => Ok(fxn),
1063      Err(_) => {
1064        match (mat,ixes) {
1065          (Value::MutableReference(lhs),rhs_value) => { impl_access_all_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1066          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1067        }
1068      }
1069    }
1070  }
1071}
1072
1073// x[1..3,:] ---------------------------------------------------------------------
1074
1075macro_rules! impl_access_range_all_match_arms {
1076  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1077    paste!{
1078      match $arg {
1079        $(
1080          $(
1081            // Vector All
1082            #[cfg(all(feature = $value_string, feature = "matrix4"))]
1083            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1084            #[cfg(all(feature = $value_string, feature = "matrix3"))]
1085            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1086            #[cfg(all(feature = $value_string, feature = "matrix2"))]
1087            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1088            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1089            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1090            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1091            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1092            #[cfg(all(feature = $value_string, feature = "matrixd"))]
1093            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixIndex(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDAMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1094            // Bool Vector All
1095            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
1096            (Value::$matrix_kind(Matrix::Matrix4(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM4{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1097            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
1098            (Value::$matrix_kind(Matrix::Matrix3(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1099            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
1100            (Value::$matrix_kind(Matrix::Matrix2(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1101            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
1102            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM3x2{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1103            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
1104            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAM2x3{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1105            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
1106            (Value::$matrix_kind(Matrix::DMatrix(input)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll]) => Ok(Box::new(Access2DVDbAMD{source: input.clone(), ixes: ix.clone(), out: Ref::new(DMatrix::from_element(ix.borrow().len(),input.borrow().ncols(),$default)) })),
1107          )+
1108        )+
1109        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1110      }
1111    }
1112  }
1113}
1114
1115fn impl_access_range_all_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1116  impl_access_match_arms!(Access2DRA, range_all, (lhs_value, ixes.as_slice()))
1117}
1118
1119pub struct MatrixAccessRangeAll {}
1120impl NativeFunctionCompiler for MatrixAccessRangeAll {
1121  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1122    if arguments.len() <= 2 {
1123      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1124    }
1125    let ixes = arguments.clone().split_off(1);
1126    let mat = arguments[0].clone();
1127    match impl_access_range_all_fxn(mat.clone(), ixes.clone()) {
1128      Ok(fxn) => Ok(fxn),
1129      Err(_) => {
1130        match (mat,ixes) {
1131          (Value::MutableReference(lhs),rhs_value) => { impl_access_range_all_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1132          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1133        }
1134      }
1135    }
1136  }
1137}
1138
1139// x[1..3,2] ---------------------------------------------------------------------
1140
1141macro_rules! impl_access_range_scalar_match_arms {
1142  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1143    paste!{
1144      match $arg {
1145        $(
1146          $(
1147            // Vector Scalar
1148            #[cfg(all(feature = $value_string, feature = "matrix4"))]
1149            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1150            #[cfg(all(feature = $value_string, feature = "matrix3"))]
1151            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1152            #[cfg(all(feature = $value_string, feature = "matrix2"))]
1153            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1154            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1155            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1156            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1157            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1158            #[cfg(all(feature = $value_string, feature = "matrixd"))]
1159            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDSMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1160            // Bool Vector Scalar
1161            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
1162            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1163            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
1164            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1165            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
1166            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1167            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
1168            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1169            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
1170            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1171            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
1172            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)]) => Ok(Box::new(Access2DVDbSMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(DVector::from_element(ix1.borrow().len(),$default)) })),
1173          )+
1174        )+
1175        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1176      }
1177    }
1178  }
1179}
1180
1181fn impl_access_range_scalar_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1182  impl_access_match_arms!(Access2DRS, range_scalar, (lhs_value, ixes.as_slice()))
1183}
1184
1185pub struct MatrixAccessRangeScalar {}
1186impl NativeFunctionCompiler for MatrixAccessRangeScalar {
1187  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1188    if arguments.len() <= 2 {
1189      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1190    }
1191    let ixes = arguments.clone().split_off(1);
1192    let mat = arguments[0].clone();
1193    match impl_access_range_scalar_fxn(mat.clone(), ixes.clone()) {
1194      Ok(fxn) => Ok(fxn),
1195      Err(_) => {
1196        match (mat,ixes) {
1197          (Value::MutableReference(lhs),rhs_value) => { impl_access_range_scalar_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1198          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1199        }
1200      }
1201    }
1202  }
1203}
1204
1205// x[2,1..3] ---------------------------------------------------------------------
1206
1207macro_rules! impl_access_scalar_range_match_arms {
1208  ($fxn_name:ident, $arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
1209    paste!{
1210      match $arg {
1211        $(
1212          $(
1213            // Scalar Vector 
1214            #[cfg(all(feature = $value_string, feature = "matrix4"))]
1215            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1216            #[cfg(all(feature = $value_string, feature = "matrix3"))]
1217            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1218            #[cfg(all(feature = $value_string, feature = "matrix2"))]
1219            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1220            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1221            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1222            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1223            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1224            #[cfg(all(feature = $value_string, feature = "matrixd"))]
1225            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1226            // Bool Scalar Vector
1227            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "bool"))]
1228            (Value::$matrix_kind(Matrix::Matrix4(input)),   [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM4{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1229            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "bool"))]
1230            (Value::$matrix_kind(Matrix::Matrix3(input)),   [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1231            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "bool"))]
1232            (Value::$matrix_kind(Matrix::Matrix2(input)),   [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1233            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "bool"))]
1234            (Value::$matrix_kind(Matrix::Matrix3x2(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM3x2{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1235            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "bool"))]
1236            (Value::$matrix_kind(Matrix::Matrix2x3(input)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbM2x3{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1237            #[cfg(all(feature = $value_string, feature = "matrixd", feature = "bool"))]
1238            (Value::$matrix_kind(Matrix::DMatrix(input)),   [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))]) => Ok(Box::new(Access2DSVDbMD{source: input.clone(), ixes: Ref::new((ix1.borrow().clone(),ix2.borrow().clone())), out: Ref::new(RowDVector::from_element(ix2.borrow().len(),$default)) })),
1239          )+
1240        )+
1241        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1242      }
1243    }
1244  }
1245}
1246
1247fn impl_access_scalar_range_fxn(lhs_value: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1248  impl_access_match_arms!(Access2DSR, scalar_range, (lhs_value, ixes.as_slice()))
1249}
1250
1251pub struct MatrixAccessScalarRange {}
1252
1253impl NativeFunctionCompiler for MatrixAccessScalarRange {
1254  fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1255    if arguments.len() <= 2 {
1256      return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1257    }
1258    let ixes = arguments.clone().split_off(1);
1259    let mat = arguments[0].clone();
1260    match impl_access_scalar_range_fxn(mat.clone(), ixes.clone()) {
1261      Ok(fxn) => Ok(fxn),
1262      Err(_) => {
1263        match (mat,ixes) {
1264          (Value::MutableReference(lhs),rhs_value) => { impl_access_scalar_range_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1265          x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1266        }
1267      }
1268    }
1269  }
1270}