1#[macro_use]
2use crate::stdlib::*;
3
4macro_rules! access_1d {
7 ($source:expr, $ix:expr, $out:expr) => {
8 unsafe { *$out = (*$source).index(*$ix - 1).clone() }
9 };}
10
11macro_rules! access_2d {
12 ($source:expr, $ix:expr, $out:expr) => {
13 unsafe {
14 let ix1 = (*$ix).0;
15 let ix2 = (*$ix).1;
16 *$out = (*$source).index((ix1 - 1, ix2 - 1)).clone()
17 }
18 };}
19macro_rules! access_1d_slice {
20 ($source:expr, $ix:expr, $out:expr) => {
21 unsafe {
22 for i in 0..(*$ix).len() {
23 ((&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
410impl_access_fxn_shape!(Access1DS, usize, T, access_1d);
412
413impl_access_fxn_shape!(Access2DSS, (usize,usize), T, access_2d);
415
416impl_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
420impl_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
426impl_access_fxn_shape!(Access1DA, Value, DVector<T>, access_1d_all);
428
429impl_access_fxn_shape!(Access2DAS, usize, DVector<T>, access_col);
431
432#[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
448impl_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
452impl_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
456impl_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
460impl_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
491macro_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
561macro_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
629macro_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 #[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 #[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 #[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 #[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 #[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
744macro_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 (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
849macro_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
901macro_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
953macro_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
1007macro_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 #[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 #[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
1073macro_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 #[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 #[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
1139macro_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 #[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 #[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
1205macro_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 #[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 #[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}