mech_core/
stdlib.rs

1pub use crate::*;
2
3// The Standard Library
4// ----------------------------------------------------------------------------
5
6// These macros are used by various libraries to generate function impl and
7// match arms. They're gated on feature flags so although there's a lot of
8// code here to account for all the different combinations, but only
9// the relevant code will be compiled in any given build.
10
11#[macro_export]
12macro_rules! compile_register_brrw {
13  ($reg:expr, $ctx:ident) => {
14    {
15      let addr = $reg.addr();
16      let reg = $ctx.alloc_register_for_ptr(addr);
17      let borrow = $reg.borrow();
18      let const_id = borrow.compile_const($ctx).unwrap();
19      $ctx.emit_const_load(reg, const_id);
20      reg
21    }
22  };
23}
24
25#[macro_export]
26macro_rules! compile_register {
27  ($reg:expr, $ctx:ident) => {
28    {
29      let addr = $reg.addr();
30      let reg = $ctx.alloc_register_for_ptr(addr);
31      let const_id = $reg.compile_const($ctx).unwrap();
32      $ctx.emit_const_load(reg, const_id);
33      reg
34    }
35  };
36}
37
38#[macro_export]
39macro_rules! compile_register_mat {
40  ($reg:expr, $ctx:ident) => {
41    {
42      let addr = $reg.addr();
43      let reg = $ctx.alloc_register_for_ptr(addr);
44      let const_id = $reg.compile_const_mat($ctx).unwrap();
45      $ctx.emit_const_load(reg, const_id);
46      reg
47    }
48  };
49}
50
51#[macro_export]
52macro_rules! compile_nullop {
53  ($name:tt, $out:expr, $ctx:ident, $feature_flag:expr) => {
54    // allocate one register as an array
55    let mut registers = [0];
56
57    // Compile out
58    registers[0] = compile_register_brrw!($out, $ctx);
59
60    $ctx.features.insert($feature_flag);
61
62    // Emit the operation
63    $ctx.emit_nullop(
64      hash_str(&$name),
65      registers[0],
66    );
67
68    return Ok(registers[0]);
69  };
70}
71
72#[macro_export]
73macro_rules! compile_unop {
74  ($name:tt, $out:expr, $arg:expr, $ctx:ident, $feature_flag:expr) => {
75    // Allocate three registers as an array
76    let mut registers = [0,0];
77
78    // Allocate registers
79    registers[0] = compile_register_brrw!($out, $ctx);
80    registers[1] = compile_register_brrw!($arg, $ctx);
81  
82    $ctx.features.insert($feature_flag);
83
84    // Emit the operation
85    $ctx.emit_unop(
86      hash_str(&$name),
87      registers[0],
88      registers[1],
89    );
90
91    return Ok(registers[0]);
92  };
93}
94
95#[macro_export]
96macro_rules! compile_binop {
97  ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $ctx:ident, $feature_flag:expr) => {
98    let mut registers = [0,0,0];
99    
100    registers[0] = compile_register_brrw!($out, $ctx);
101    registers[1] = compile_register_brrw!($arg1, $ctx);
102    registers[2] = compile_register_brrw!($arg2, $ctx);
103
104    $ctx.features.insert($feature_flag);
105
106    $ctx.emit_binop(
107      hash_str(&$name),
108      registers[0],
109      registers[1],
110      registers[2],
111    );
112
113    return Ok(registers[0])
114  };
115}
116
117#[macro_export]
118macro_rules! compile_ternop {
119  ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $arg3:expr, $ctx:ident, $feature_flag:expr) => {
120    let mut registers = [0,0,0,0];
121
122    registers[0] = compile_register_brrw!($out, $ctx);
123    registers[1] = compile_register_brrw!($arg1, $ctx);
124    registers[2] = compile_register_brrw!($arg2, $ctx);
125    registers[3] = compile_register_brrw!($arg3, $ctx);
126
127    $ctx.features.insert($feature_flag);
128
129    $ctx.emit_ternop(
130      hash_str(&$name),
131      registers[0],
132      registers[1],
133      registers[2],
134      registers[3],
135    );
136
137    return Ok(registers[0])
138  };
139}
140
141#[macro_export]
142macro_rules! compile_quadop {
143  ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $ctx:ident, $feature_flag:expr) => {
144    let mut registers = [0,0,0,0,0];
145
146    registers[0] = compile_register_brrw!($out, $ctx);
147    registers[1] = compile_register_brrw!($arg1, $ctx);
148    registers[2] = compile_register_brrw!($arg2, $ctx);
149    registers[3] = compile_register_brrw!($arg3, $ctx);
150    registers[4] = compile_register_brrw!($arg4, $ctx);
151
152    $ctx.features.insert($feature_flag);
153
154    $ctx.emit_quadop(
155      hash_str(&$name),
156      registers[0],
157      registers[1],
158      registers[2],
159      registers[3],
160      registers[4],
161    );
162    return Ok(registers[0])
163  };
164}
165
166#[macro_export]
167macro_rules! register_fxn_descriptor_inner_logic {
168  // single type
169  ($struct_name:ident, $type:ty, $type_string:tt) => {
170    paste!{
171      #[cfg(feature = $type_string)]
172      inventory::submit! {
173        FunctionDescriptor {
174          name: concat!(stringify!($struct_name), "<", stringify!([<$type:lower>]), ">"),
175          ptr: $struct_name::new,
176        }
177      }
178    }
179  };
180}
181
182#[macro_export]
183macro_rules! register_fxn_descriptor_inner {
184  // single type
185  ($struct_name:ident, $type:ty, $type_string:tt) => {
186    paste!{
187      #[cfg(feature = $type_string)]
188      inventory::submit! {
189        FunctionDescriptor {
190          name: concat!(stringify!($struct_name), "<", stringify!([<$type:lower>]), ">"),
191          ptr: $struct_name::<$type>::new,
192        }
193      }
194    }
195  };
196}
197
198#[macro_export]
199macro_rules! register_fxn_descriptor {
200  ($struct_name:ident, $($type:ty, $type_string:tt),+ $(,)?) => {
201    $( register_fxn_descriptor_inner!($struct_name, $type, $type_string); )+
202  };
203}
204
205#[macro_export]
206macro_rules! impl_binop {
207  ($struct_name:ident, $arg1_type:ty, $arg2_type:ty, $out_type:ty, $op:ident, $feature_flag:expr) => {
208    #[derive(Debug)]
209    pub struct $struct_name<T> {
210      pub lhs: Ref<$arg1_type>,
211      pub rhs: Ref<$arg2_type>,
212      pub out: Ref<$out_type>,
213    }
214    impl<T> MechFunctionFactory for $struct_name<T> 
215    where
216      T: Copy + Debug + Display + Clone + Sync + Send + 'static + 
217      PartialEq + PartialOrd + ConstElem + CompileConst + AsValueKind +
218      Add<Output = T> + AddAssign +
219      Sub<Output = T> + SubAssign +
220      Mul<Output = T> + MulAssign +
221      Div<Output = T> + DivAssign +
222      Zero + One,
223      Ref<$out_type>: ToValue,
224    {
225      fn new(args: FunctionArgs) -> MResult<Box<dyn MechFunction>> {
226        match args {
227          FunctionArgs::Binary(out, arg1, arg2) => {
228            let lhs: Ref<$arg1_type> = unsafe { arg1.as_unchecked() }.clone();
229            let rhs: Ref<$arg2_type> = unsafe { arg2.as_unchecked() }.clone();
230            let out: Ref<$out_type> = unsafe { out.as_unchecked() }.clone();
231            Ok(Box::new(Self {lhs, rhs, out }))
232          },
233          _ => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{} requires 2 arguments, got {:?}", stringify!($struct_name), args), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments})
234        }
235      }
236    }
237    impl<T> MechFunctionImpl for $struct_name<T>
238    where
239      T: Copy + Debug + Display + Clone + Sync + Send + 'static + 
240      PartialEq + PartialOrd +
241      Add<Output = T> + AddAssign +
242      Sub<Output = T> + SubAssign +
243      Mul<Output = T> + MulAssign +
244      Div<Output = T> + DivAssign +
245      Zero + One,
246      Ref<$out_type>: ToValue
247    {
248      fn solve(&self) {
249          let lhs_ptr = self.lhs.as_ptr();
250          let rhs_ptr = self.rhs.as_ptr();
251          let out_ptr = self.out.as_mut_ptr();
252          $op!(lhs_ptr,rhs_ptr,out_ptr);
253      }
254      fn out(&self) -> Value { self.out.to_value() }
255      fn to_string(&self) -> String { format!("{:#?}", self) }
256    }   
257    #[cfg(feature = "compiler")]
258    impl<T> MechFunctionCompiler for $struct_name<T> 
259    where
260      T: ConstElem + CompileConst + AsValueKind
261    {
262      fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
263        let name = format!("{}<{}>", stringify!($struct_name), T::as_value_kind());
264        compile_binop!(name, self.out, self.lhs, self.rhs, ctx, $feature_flag);
265      }
266    }
267  };
268}
269
270#[macro_export]  
271macro_rules! impl_unop {
272  ($struct_name:ident, $arg_type:ty, $out_type:ty, $op:ident, $feature_flag:expr) => {
273    #[derive(Debug)]
274    struct $struct_name {
275      arg: Ref<$arg_type>,
276      out: Ref<$out_type>,
277    }
278    impl MechFunctionFactory for $struct_name {
279      fn new(args: FunctionArgs) -> MResult<Box<dyn MechFunction>> {
280        match args {
281          FunctionArgs::Unary(out, arg) => {
282            let arg: Ref<$arg_type> = unsafe { arg.as_unchecked() }.clone();
283            let out: Ref<$out_type> = unsafe { out.as_unchecked() }.clone();
284            Ok(Box::new(Self {arg, out }))
285          },
286          _ => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{} requires 2 arguments, got {:?}", stringify!($struct_name), args), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments})
287        }
288      }
289    }
290    impl MechFunctionImpl for $struct_name {
291      fn solve(&self) {
292        let arg_ptr = self.arg.as_ptr();
293        let out_ptr = self.out.as_mut_ptr();
294        $op!(arg_ptr,out_ptr);
295      }
296      fn out(&self) -> Value { self.out.to_value() }
297      fn to_string(&self) -> String { format!("{:#?}", self) }
298    }
299    #[cfg(feature = "compiler")]
300    impl MechFunctionCompiler for $struct_name {
301      fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
302        let name = format!("{}", stringify!($struct_name));
303        compile_unop!(name, self.out, self.arg, ctx, $feature_flag);
304      }
305    }
306    inventory::submit! {
307      FunctionDescriptor {
308        name: stringify!($struct_name),
309        ptr: $struct_name::new,
310      }
311    }
312  };} 
313
314#[macro_export]
315macro_rules! impl_fxns {
316  ($lib:ident, $in:ident, $out:ident, $op:ident) => {
317    paste!{
318      // Scalar
319      $op!([<$lib SS>], $in, $in, $out, [<$lib:lower _op>], FeatureFlag::Builtin(FeatureKind::$lib));
320      // Scalar Matrix
321      #[cfg(feature = "matrix1")]
322      $op!([<$lib SM1>], $in, Matrix1<$in>, Matrix1<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
323      #[cfg(feature = "matrix2")]
324      $op!([<$lib SM2>], $in, Matrix2<$in>, Matrix2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
325      #[cfg(feature = "matrix3")]
326      $op!([<$lib SM3>], $in, Matrix3<$in>, Matrix3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
327      
328      #[cfg(feature = "matrix4")]
329      $op!([<$lib SM4>], $in, Matrix4<$in>, Matrix4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
330      #[cfg(feature = "matrix2x3")]
331      $op!([<$lib SM2x3>], $in, Matrix2x3<$in>, Matrix2x3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
332      #[cfg(feature = "matrix3x2")]
333      $op!([<$lib SM3x2>], $in, Matrix3x2<$in>, Matrix3x2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
334      #[cfg(feature = "matrixd")]
335      $op!([<$lib SMD>], $in, DMatrix<$in>, DMatrix<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
336      // Scalar Row
337      #[cfg(feature = "row_vector2")]
338      $op!([<$lib SR2>], $in, RowVector2<$in>, RowVector2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
339      #[cfg(feature = "row_vector3")]
340      $op!([<$lib SR3>], $in, RowVector3<$in>, RowVector3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
341      #[cfg(feature = "row_vector4")]
342      $op!([<$lib SR4>], $in, RowVector4<$in>, RowVector4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
343      #[cfg(feature = "row_vectord")]
344      $op!([<$lib SRD>], $in, RowDVector<$in>, RowDVector<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
345      // Scalar Vector
346      #[cfg(feature = "vector2")]
347      $op!([<$lib SV2>], $in, Vector2<$in>, Vector2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
348      #[cfg(feature = "vector3")]
349      $op!([<$lib SV3>], $in, Vector3<$in>, Vector3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
350      #[cfg(feature = "vector4")]
351      $op!([<$lib SV4>], $in, Vector4<$in>, Vector4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
352      #[cfg(feature = "vectord")]
353      $op!([<$lib SVD>], $in, DVector<$in>, DVector<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
354      // Matrix Scalar
355      #[cfg(feature = "matrix1")]
356      $op!([<$lib M1S>], Matrix1<$in>, $in, Matrix1<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
357      #[cfg(feature = "matrix2")]
358      $op!([<$lib M2S>], Matrix2<$in>, $in, Matrix2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
359      #[cfg(feature = "matrix3")]
360      $op!([<$lib M3S>], Matrix3<$in>, $in, Matrix3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
361      #[cfg(feature = "matrix4")]
362      $op!([<$lib M4S>], Matrix4<$in>, $in, Matrix4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
363      #[cfg(feature = "matrix2x3")]
364      $op!([<$lib M2x3S>], Matrix2x3<$in>, $in, Matrix2x3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
365      #[cfg(feature = "matrix3x2")]
366      $op!([<$lib M3x2S>], Matrix3x2<$in>, $in, Matrix3x2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
367      #[cfg(feature = "matrixd")]
368      $op!([<$lib MDS>], DMatrix<$in>, $in, DMatrix<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
369      // Row Scalar
370      #[cfg(feature = "row_vector2")]
371      $op!([<$lib R2S>], RowVector2<$in>, $in, RowVector2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
372      #[cfg(feature = "row_vector3")]
373      $op!([<$lib R3S>], RowVector3<$in>, $in, RowVector3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
374      #[cfg(feature = "row_vector4")]
375      $op!([<$lib R4S>], RowVector4<$in>, $in, RowVector4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
376      #[cfg(feature = "row_vectord")]
377      $op!([<$lib RDS>], RowDVector<$in>, $in, RowDVector<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
378      // Vector Scalar
379      #[cfg(feature = "vector2")]
380      $op!([<$lib V2S>], Vector2<$in>, $in, Vector2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
381      #[cfg(feature = "vector3")]
382      $op!([<$lib V3S>], Vector3<$in>, $in, Vector3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
383      #[cfg(feature = "vector4")]
384      $op!([<$lib V4S>], Vector4<$in>, $in, Vector4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
385      #[cfg(feature = "vectord")]
386      $op!([<$lib VDS>], DVector<$in>, $in, DVector<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
387      // Matrix Matrix
388      #[cfg(feature = "matrix1")]
389      $op!([<$lib M1M1>], Matrix1<$in>, Matrix1<$in>, Matrix1<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
390      #[cfg(feature = "matrix2")]
391      $op!([<$lib M2M2>], Matrix2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
392      #[cfg(feature = "matrix3")]
393      $op!([<$lib M3M3>], Matrix3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
394      #[cfg(feature = "matrix4")]
395      $op!([<$lib M4M4>], Matrix4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
396      #[cfg(feature = "matrix2x3")]
397      $op!([<$lib M2x3M2x3>], Matrix2x3<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
398      #[cfg(feature = "matrix3x2")]
399      $op!([<$lib M3x2M3x2>], Matrix3x2<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
400      #[cfg(feature = "matrixd")]
401      $op!([<$lib MDMD>], DMatrix<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
402      // Matrix Vector
403      #[cfg(all(feature = "matrix2", feature = "vector2"))]
404      $op!([<$lib M2V2>], Matrix2<$in>, Vector2<$in>, Matrix2<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
405      #[cfg(all(feature = "matrix3", feature = "vector3"))]
406      $op!([<$lib M3V3>], Matrix3<$in>, Vector3<$in>, Matrix3<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
407      #[cfg(all(feature = "matrix4", feature = "vector4"))]
408      $op!([<$lib M4V4>], Matrix4<$in>, Vector4<$in>, Matrix4<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
409      #[cfg(all(feature = "matrix2x3", feature = "vector2"))]
410      $op!([<$lib M2x3V2>], Matrix2x3<$in>, Vector2<$in>, Matrix2x3<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
411      #[cfg(all(feature = "matrix3x2", feature = "vector3"))]
412      $op!([<$lib M3x2V3>], Matrix3x2<$in>, Vector3<$in>, Matrix3x2<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
413      #[cfg(all(feature = "matrixd", feature = "vectord"))]
414      $op!([<$lib MDVD>], DMatrix<$in>, DVector<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
415      #[cfg(all(feature = "matrixd", feature = "vector2"))]
416      $op!([<$lib MDV2>], DMatrix<$in>, Vector2<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
417      #[cfg(all(feature = "matrixd", feature = "vector3"))]
418      $op!([<$lib MDV3>], DMatrix<$in>, Vector3<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
419      #[cfg(all(feature = "matrixd", feature = "vector4"))]
420      $op!([<$lib MDV4>], DMatrix<$in>, Vector4<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
421      // Vector Matrix
422      #[cfg(all(feature = "vector2", feature = "matrix2"))]
423      $op!([<$lib V2M2>], Vector2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
424      #[cfg(all(feature = "vector3", feature = "matrix3"))]
425      $op!([<$lib V3M3>], Vector3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
426      #[cfg(all(feature = "vector4", feature = "matrix4"))]
427      $op!([<$lib V4M4>], Vector4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
428      #[cfg(all(feature = "vector2", feature = "matrix2x3"))]
429      $op!([<$lib V2M2x3>], Vector2<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
430      #[cfg(all(feature = "vector3", feature = "matrix3x2"))]
431      $op!([<$lib V3M3x2>], Vector3<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
432      #[cfg(all(feature = "vectord", feature = "matrixd"))]
433      $op!([<$lib VDMD>], DVector<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
434      #[cfg(all(feature = "vector2", feature = "matrixd"))]
435      $op!([<$lib V2MD>], Vector2<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
436      #[cfg(all(feature = "vector3", feature = "matrixd"))]
437      $op!([<$lib V3MD>], Vector3<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
438      #[cfg(all(feature = "vector4", feature = "matrixd"))]
439      $op!([<$lib V4MD>], Vector4<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
440      // Matrix Row
441      #[cfg(all(feature = "matrix2", feature = "row_vector2"))]
442      $op!([<$lib M2R2>], Matrix2<$in>, RowVector2<$in>, Matrix2<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib)); 
443      #[cfg(all(feature = "matrix3", feature = "row_vector3"))]
444      $op!([<$lib M3R3>], Matrix3<$in>, RowVector3<$in>, Matrix3<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
445      #[cfg(all(feature = "matrix4", feature = "row_vector4"))]
446      $op!([<$lib M4R4>], Matrix4<$in>, RowVector4<$in>, Matrix4<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
447      #[cfg(all(feature = "matrix2x3", feature = "row_vector3"))]
448      $op!([<$lib M2x3R3>], Matrix2x3<$in>, RowVector3<$in>, Matrix2x3<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
449      #[cfg(all(feature = "matrix3x2", feature = "row_vector2"))]
450      $op!([<$lib M3x2R2>], Matrix3x2<$in>, RowVector2<$in>, Matrix3x2<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
451      #[cfg(all(feature = "matrixd", feature = "row_vectord"))]
452      $op!([<$lib MDRD>], DMatrix<$in>, RowDVector<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
453      #[cfg(all(feature = "matrixd", feature = "row_vector2"))]
454      $op!([<$lib MDR2>], DMatrix<$in>, RowVector2<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
455      #[cfg(all(feature = "matrixd", feature = "row_vector3"))]
456      $op!([<$lib MDR3>], DMatrix<$in>, RowVector3<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
457      #[cfg(all(feature = "matrixd", feature = "row_vector4"))]
458      $op!([<$lib MDR4>], DMatrix<$in>, RowVector4<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib)); 
459      // Row Matrix
460      #[cfg(all(feature = "row_vector2", feature = "matrix2"))]
461      $op!([<$lib R2M2>], RowVector2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib)); 
462      #[cfg(all(feature = "row_vector3", feature = "matrix3"))]
463      $op!([<$lib R3M3>], RowVector3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
464      #[cfg(all(feature = "row_vector4", feature = "matrix4"))]
465      $op!([<$lib R4M4>], RowVector4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
466      #[cfg(all(feature = "row_vector3", feature = "matrix2x3"))]
467      $op!([<$lib R3M2x3>], RowVector3<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
468      #[cfg(all(feature = "row_vector2", feature = "matrix3x2"))]
469      $op!([<$lib R2M3x2>], RowVector2<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
470      #[cfg(all(feature = "row_vectord", feature = "matrixd"))]
471      $op!([<$lib RDMD>], RowDVector<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
472      #[cfg(all(feature = "row_vector2", feature = "matrixd"))]
473      $op!([<$lib R2MD>], RowVector2<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
474      #[cfg(all(feature = "row_vector3", feature = "matrixd"))]
475      $op!([<$lib R3MD>], RowVector3<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
476      #[cfg(all(feature = "row_vector4", feature = "matrixd"))]
477      $op!([<$lib R4MD>], RowVector4<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
478      // Row Row
479      #[cfg(feature = "row_vector2")]
480      $op!([<$lib R2R2>], RowVector2<$in>, RowVector2<$in>, RowVector2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
481      #[cfg(feature = "row_vector3")]
482      $op!([<$lib R3R3>], RowVector3<$in>, RowVector3<$in>, RowVector3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
483      #[cfg(feature = "row_vector4")]
484      $op!([<$lib R4R4>], RowVector4<$in>, RowVector4<$in>, RowVector4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
485      #[cfg(feature = "row_vectord")]
486      $op!([<$lib RDRD>], RowDVector<$in>, RowDVector<$in>, RowDVector<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
487      // Vector Vector
488      #[cfg(feature = "vector2")]
489      $op!([<$lib V2V2>], Vector2<$in>, Vector2<$in>, Vector2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
490      #[cfg(feature = "vector3")]
491      $op!([<$lib V3V3>], Vector3<$in>, Vector3<$in>, Vector3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
492      #[cfg(feature = "vector4")]
493      $op!([<$lib V4V4>], Vector4<$in>, Vector4<$in>, Vector4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
494      #[cfg(feature = "vectord")]
495      $op!([<$lib VDVD>], DVector<$in>, DVector<$in>, DVector<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
496    }
497  }}
498
499#[macro_export]
500macro_rules! impl_binop_match_arms {
501  ($lib:ident, $registrar:tt, $arg:expr, $($lhs_type:ident, $($target_type:ident, $value_string:tt),+);+ $(;)?) => {
502    paste!{
503      match $arg {
504        $(
505          $(
506            // Scalar Scalar
507            #[cfg(all(feature = $value_string))]
508            (Value::$lhs_type(lhs), Value::$lhs_type(rhs)) => {
509              $registrar!([<$lib SS>], $target_type, $value_string);
510              Ok(Box::new([<$lib SS>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new($target_type::default()) }))
511            },
512            // Scalar Matrix
513            #[cfg(all(feature = $value_string, feature = "matrix1"))]
514            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix1(rhs))) => {
515              $registrar!([<$lib SM1>], $target_type, $value_string);
516              Ok(Box::new([<$lib SM1>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
517            },
518            #[cfg(all(feature = $value_string, feature = "matrix2"))]
519            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
520              $registrar!([<$lib SM2>], $target_type, $value_string);
521              Ok(Box::new([<$lib SM2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
522            },
523            #[cfg(all(feature = $value_string, feature = "matrix3"))]
524            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
525              $registrar!([<$lib SM3>], $target_type, $value_string);
526              Ok(Box::new([<$lib SM3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
527            },
528            #[cfg(all(feature = $value_string, feature = "matrix4"))]
529            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
530              $registrar!([<$lib SM4>], $target_type, $value_string);
531              Ok(Box::new([<$lib SM4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
532            },
533            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
534            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
535              $registrar!([<$lib SM2x3>], $target_type, $value_string);
536              Ok(Box::new([<$lib SM2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
537            },
538            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
539            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
540              $registrar!([<$lib SM3x2>], $target_type, $value_string);
541              Ok(Box::new([<$lib SM3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
542            },
543            #[cfg(all(feature = $value_string, feature = "matrixd"))]
544            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
545              let (rows,cols) = {rhs.borrow().shape()};
546              $registrar!([<$lib SMD>], $target_type, $value_string);
547              Ok(Box::new([<$lib SMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
548            },   
549            // Scalar Row
550            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
551            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
552              $registrar!([<$lib SR2>], $target_type, $value_string);
553              Ok(Box::new([<$lib SR2>]{lhs, rhs, out: Ref::new(RowVector2::from_element($target_type::default()))}))
554            },
555            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
556            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
557              $registrar!([<$lib SR3>], $target_type, $value_string);
558              Ok(Box::new([<$lib SR3>]{lhs, rhs, out: Ref::new(RowVector3::from_element($target_type::default()))}))
559            },
560            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
561            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
562              $registrar!([<$lib SR4>], $target_type, $value_string);
563              Ok(Box::new([<$lib SR4>]{lhs, rhs, out: Ref::new(RowVector4::from_element($target_type::default()))}))
564            },
565            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
566            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowDVector(rhs))) => {
567              $registrar!([<$lib SRD>], $target_type, $value_string);
568              Ok(Box::new([<$lib SRD>]{lhs, rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().len(),$target_type::default()))}))
569            },
570            // Scalar Vector
571            #[cfg(all(feature = $value_string, feature = "vector2"))]
572            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
573              $registrar!([<$lib SV2>], $target_type, $value_string);
574              Ok(Box::new([<$lib SV2>]{lhs, rhs, out: Ref::new(Vector2::from_element($target_type::default()))}))
575            },
576            #[cfg(all(feature = $value_string, feature = "vector3"))]
577            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
578              $registrar!([<$lib SV3>], $target_type, $value_string);
579              Ok(Box::new([<$lib SV3>]{lhs, rhs, out: Ref::new(Vector3::from_element($target_type::default()))}))
580            },
581            #[cfg(all(feature = $value_string, feature = "vector4"))]
582            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
583              $registrar!([<$lib SV4>], $target_type, $value_string);
584              Ok(Box::new([<$lib SV4>]{lhs, rhs, out: Ref::new(Vector4::from_element($target_type::default()))}))
585            },
586            #[cfg(all(feature = $value_string, feature = "vectord"))]
587            (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::DVector(rhs))) => {
588              $registrar!([<$lib SVD>], $target_type, $value_string);
589              Ok(Box::new([<$lib SVD>]{lhs, rhs: rhs.clone(), out: Ref::new(DVector::from_element(rhs.borrow().len(),$target_type::default()))}))
590            },
591            // Matrix Scalar
592            #[cfg(all(feature = $value_string, feature = "matrix1"))]
593            (Value::[<Matrix $lhs_type>](Matrix::Matrix1(lhs)),Value::$lhs_type(rhs)) => {
594              $registrar!([<$lib M1S>], $target_type, $value_string);
595              Ok(Box::new([<$lib M1S>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
596            },
597            #[cfg(all(feature = $value_string, feature = "matrix2"))]
598            (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::$lhs_type(rhs)) => {
599              $registrar!([<$lib M2S>], $target_type, $value_string);
600              Ok(Box::new([<$lib M2S>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
601            },
602            #[cfg(all(feature = $value_string, feature = "matrix3"))]
603            (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::$lhs_type(rhs)) => {
604              $registrar!([<$lib M3S>], $target_type, $value_string);
605              Ok(Box::new([<$lib M3S>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
606            },
607            #[cfg(all(feature = $value_string, feature = "matrix4"))]
608            (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::$lhs_type(rhs)) => {
609              $registrar!([<$lib M4S>], $target_type, $value_string);
610              Ok(Box::new([<$lib M4S>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
611            },
612            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
613            (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::$lhs_type(rhs)) => {
614              $registrar!([<$lib M2x3S>], $target_type, $value_string);
615              Ok(Box::new([<$lib M2x3S>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
616            },
617            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
618            (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::$lhs_type(rhs)) => {
619              $registrar!([<$lib M3x2S>], $target_type, $value_string);
620              Ok(Box::new([<$lib M3x2S>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
621            },
622            #[cfg(all(feature = $value_string, feature = "matrixd"))]
623            (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)),Value::$lhs_type(rhs)) => {
624              let (rows,cols) = {lhs.borrow().shape()};
625              $registrar!([<$lib MDS>], $target_type, $value_string);
626              Ok(Box::new([<$lib MDS>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
627            },
628            // Row Scalar
629            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
630            (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)),Value::$lhs_type(rhs)) => {
631              $registrar!([<$lib R2S>], $target_type, $value_string);
632              Ok(Box::new([<$lib R2S>]{lhs, rhs, out: Ref::new(RowVector2::from_element($target_type::default()))}))
633            },
634            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
635            (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)),Value::$lhs_type(rhs)) => {
636              $registrar!([<$lib R3S>], $target_type, $value_string);
637              Ok(Box::new([<$lib R3S>]{lhs, rhs, out: Ref::new(RowVector3::from_element($target_type::default()))}))
638            },
639            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
640            (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)),Value::$lhs_type(rhs)) => {
641              $registrar!([<$lib R4S>], $target_type, $value_string);
642              Ok(Box::new([<$lib R4S>]{lhs, rhs, out: Ref::new(RowVector4::from_element($target_type::default()))}))
643            },
644            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
645            (Value::[<Matrix $lhs_type>](Matrix::RowDVector(lhs)),Value::$lhs_type(rhs)) => {
646              $registrar!([<$lib RDS>], $target_type, $value_string);
647              Ok(Box::new([<$lib RDS>]{lhs: lhs.clone(), rhs, out: Ref::new(RowDVector::from_element(lhs.borrow().len(),$target_type::default()))}))
648            },
649            // Vector Scalar
650            #[cfg(all(feature = $value_string, feature = "vector2"))]
651            (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)),Value::$lhs_type(rhs)) => {
652              $registrar!([<$lib V2S>], $target_type, $value_string);
653              Ok(Box::new([<$lib V2S>]{lhs, rhs, out: Ref::new(Vector2::from_element($target_type::default()))}))
654            },
655            #[cfg(all(feature = $value_string, feature = "vector3"))]
656            (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)),Value::$lhs_type(rhs)) => {
657              $registrar!([<$lib V3S>], $target_type, $value_string);
658              Ok(Box::new([<$lib V3S>]{lhs, rhs, out: Ref::new(Vector3::from_element($target_type::default()))}))
659            },
660            #[cfg(all(feature = $value_string, feature = "vector4"))]
661            (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)),Value::$lhs_type(rhs)) => {
662              $registrar!([<$lib V4S>], $target_type, $value_string);
663              Ok(Box::new([<$lib V4S>]{lhs, rhs, out: Ref::new(Vector4::from_element($target_type::default()))}))
664            },
665            #[cfg(all(feature = $value_string, feature = "vectord"))]
666            (Value::[<Matrix $lhs_type>](Matrix::DVector(lhs)),Value::$lhs_type(rhs)) => {
667              $registrar!([<$lib VDS>], $target_type, $value_string);
668              Ok(Box::new([<$lib VDS>]{lhs: lhs.clone(), rhs, out: Ref::new(DVector::from_element(lhs.borrow().len(),$target_type::default()))}))
669            },
670            // Matrix Matrix
671            #[cfg(all(feature = $value_string, feature = "matrix1"))]
672            (Value::[<Matrix $lhs_type>](Matrix::Matrix1(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix1(rhs))) => {
673              $registrar!([<$lib M1M1>], $target_type, $value_string);
674              Ok(Box::new([<$lib M1M1>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
675            },
676            #[cfg(all(feature = $value_string, feature = "matrix2"))]
677            (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
678              $registrar!([<$lib M2M2>], $target_type, $value_string);
679              Ok(Box::new([<$lib M2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
680            },
681            #[cfg(all(feature = $value_string, feature = "matrix3"))]
682            (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
683              $registrar!([<$lib M3M3>], $target_type, $value_string);
684              Ok(Box::new([<$lib M3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
685            },
686            #[cfg(all(feature = $value_string, feature = "matrix4"))]
687            (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
688              $registrar!([<$lib M4M4>], $target_type, $value_string);
689              Ok(Box::new([<$lib M4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
690            },
691            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
692            (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
693              $registrar!([<$lib M2x3M2x3>], $target_type, $value_string);
694              Ok(Box::new([<$lib M2x3M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
695            },
696            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
697            (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
698              $registrar!([<$lib M3x2M3x2>], $target_type, $value_string);
699              Ok(Box::new([<$lib M3x2M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
700            },
701              #[cfg(all(feature = $value_string, feature = "matrixd"))]
702            (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)), Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
703              let (rows,cols) = {lhs.borrow().shape()};
704              Ok(Box::new([<$lib MDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
705            },
706            // Row Row
707            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
708            (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
709              $registrar!([<$lib R2R2>], $target_type, $value_string);
710              Ok(Box::new([<$lib R2R2>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector2::from_element($target_type::default())) }))
711            },
712            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
713            (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
714              $registrar!([<$lib R3R3>], $target_type, $value_string);
715              Ok(Box::new([<$lib R3R3>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector3::from_element($target_type::default())) }))
716            },
717            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
718            (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
719              $registrar!([<$lib R4R4>], $target_type, $value_string);
720              Ok(Box::new([<$lib R4R4>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector4::from_element($target_type::default())) }))
721            },
722            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
723            (Value::[<Matrix $lhs_type>](Matrix::RowDVector(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowDVector(rhs))) => {
724              $registrar!([<$lib RDRD>], $target_type, $value_string);
725              Ok(Box::new([<$lib RDRD>]{lhs: lhs.clone(), rhs, out: Ref::new(RowDVector::from_element(lhs.borrow().len(),$target_type::default())) }))
726            },
727            // Vector Vector
728            #[cfg(all(feature = $value_string, feature = "vector2"))]
729            (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
730              $registrar!([<$lib V2V2>], $target_type, $value_string);
731              Ok(Box::new([<$lib V2V2>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector2::from_element($target_type::default())) }))
732            },
733            #[cfg(all(feature = $value_string, feature = "vector3"))]
734            (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
735              $registrar!([<$lib V3V3>], $target_type, $value_string);
736              Ok(Box::new([<$lib V3V3>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector3::from_element($target_type::default())) }))
737            },
738            #[cfg(all(feature = $value_string, feature = "vector4"))]
739            (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
740              $registrar!([<$lib V4V4>], $target_type, $value_string);
741              Ok(Box::new([<$lib V4V4>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector4::from_element($target_type::default())) }))
742            },
743            #[cfg(all(feature = $value_string, feature = "vectord"))]
744            (Value::[<Matrix $lhs_type>](Matrix::DVector(lhs)), Value::[<Matrix $lhs_type>](Matrix::DVector(rhs))) => {
745              $registrar!([<$lib VDVD>], $target_type, $value_string);
746              Ok(Box::new([<$lib VDVD>]{lhs: lhs.clone(), rhs, out: Ref::new(DVector::from_element(lhs.borrow().len(),$target_type::default())) }))
747            },
748            // Matrix Vector
749            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
750            (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
751              $registrar!([<$lib M2V2>], $target_type, $value_string);
752              Ok(Box::new([<$lib M2V2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
753            },
754            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
755            (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
756              $registrar!([<$lib M3V3>], $target_type, $value_string);
757              Ok(Box::new([<$lib M3V3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
758            },
759            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector2"))]
760            (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
761              $registrar!([<$lib M2x3V2>], $target_type, $value_string);
762              Ok(Box::new([<$lib M2x3V2>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
763            },
764            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector3"))]
765            (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
766              $registrar!([<$lib M3x2V3>], $target_type, $value_string);
767              Ok(Box::new([<$lib M3x2V3>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
768            },
769            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
770            (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
771              $registrar!([<$lib M4V4>], $target_type, $value_string);
772              Ok(Box::new([<$lib M4V4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
773            },
774            // Vector Matrix
775            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "row_vector2"))]
776            (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
777              $registrar!([<$lib M2R2>], $target_type, $value_string);
778              Ok(Box::new([<$lib M2R2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
779            },
780            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "row_vector3"))]
781            (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
782              $registrar!([<$lib M3R3>], $target_type, $value_string);
783              Ok(Box::new([<$lib M3R3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
784            },
785            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "row_vector3"))]
786            (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
787              $registrar!([<$lib M2x3R3>], $target_type, $value_string);
788              Ok(Box::new([<$lib M2x3R3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
789            },
790            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "row_vector2"))]
791            (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
792              $registrar!([<$lib M3x2R2>], $target_type, $value_string);
793              Ok(Box::new([<$lib M3x2R2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
794            },
795            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "row_vector4"))]
796            (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
797              $registrar!([<$lib M4R4>], $target_type, $value_string);
798              Ok(Box::new([<$lib M4R4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
799            },
800            #[cfg(all(feature = $value_string, feature = "matrixd"))]
801            (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)),Value::[<Matrix $lhs_type>](rhs)) => {
802              let (rows,cols) = {lhs.borrow().shape()};
803              let rhs_shape = rhs.shape();
804              match (rows,cols,rhs_shape[0],rhs_shape[1]) {
805              // matching rows
806              (n,_,m,1) if n == m => (),
807              // matching cols
808              (_,n,1,m) if n == m => (),
809              // mismatching dimensions
810              _ => {return Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });},
811              }
812              match rhs {
813              #[cfg(feature = "vector2")]
814              Matrix::Vector2(rhs) => {
815                $registrar!([<$lib MDV2>], $target_type, $value_string);
816                Ok(Box::new([<$lib MDV2>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
817              },
818              #[cfg(feature = "vector3")]
819              Matrix::Vector3(rhs) => {
820                $registrar!([<$lib MDV3>], $target_type, $value_string);
821                Ok(Box::new([<$lib MDV3>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
822              },
823              #[cfg(feature = "vector4")]
824              Matrix::Vector4(rhs) => {
825                $registrar!([<$lib MDV4>], $target_type, $value_string);
826                Ok(Box::new([<$lib MDV4>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
827              },
828              #[cfg(feature = "vectord")]
829              Matrix::DVector(rhs) => {
830                $registrar!([<$lib MDVD>], $target_type, $value_string);
831                Ok(Box::new([<$lib MDVD>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
832              },
833              #[cfg(feature = "row_vector2")]
834              Matrix::RowVector2(rhs) => {
835                $registrar!([<$lib MDR2>], $target_type, $value_string);
836                Ok(Box::new([<$lib MDR2>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
837              },
838              #[cfg(feature = "row_vector3")]
839              Matrix::RowVector3(rhs) => {
840                $registrar!([<$lib MDR3>], $target_type, $value_string);
841                Ok(Box::new([<$lib MDR3>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
842              },
843              #[cfg(feature = "row_vector4")]
844              Matrix::RowVector4(rhs) => {
845                $registrar!([<$lib MDR4>], $target_type, $value_string);
846                Ok(Box::new([<$lib MDR4>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
847              },
848              #[cfg(feature = "row_vectord")]
849              Matrix::RowDVector(rhs) => {
850                $registrar!([<$lib MDRD>], $target_type, $value_string);
851                Ok(Box::new([<$lib MDRD>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
852              },
853              _ => {return Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });},
854              }
855            },
856            // Vector Matrix
857            #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
858            (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
859              $registrar!([<$lib V2M2>], $target_type, $value_string);
860              Ok(Box::new([<$lib V2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
861            },         
862            #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
863            (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
864              $registrar!([<$lib V3M3>], $target_type, $value_string);
865              Ok(Box::new([<$lib V3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
866            },         
867            #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector2"))]
868            (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
869              $registrar!([<$lib V2M2x3>], $target_type, $value_string);
870              Ok(Box::new([<$lib V2M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
871            },         
872            #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector3"))]
873            (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
874              $registrar!([<$lib V3M3x2>], $target_type, $value_string);
875              Ok(Box::new([<$lib V3M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
876            },                     
877            #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
878            (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
879              $registrar!([<$lib V4M4>], $target_type, $value_string);
880              Ok(Box::new([<$lib V4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
881            },                     
882            // Row Matrix     
883            #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
884            (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
885              $registrar!([<$lib R2M2>], $target_type, $value_string);
886              Ok(Box::new([<$lib R2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
887            },         
888            #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
889            (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
890              $registrar!([<$lib R3M3>], $target_type, $value_string);
891              Ok(Box::new([<$lib R3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
892            },         
893            #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix2x3"))]
894            (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
895              $registrar!([<$lib R3M2x3>], $target_type, $value_string);
896              Ok(Box::new([<$lib R3M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
897            },         
898            #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix3x2"))]
899            (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
900              $registrar!([<$lib R2M3x2>], $target_type, $value_string);
901              Ok(Box::new([<$lib R2M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
902            },         
903            #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
904            (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
905              $registrar!([<$lib R4M4>], $target_type, $value_string);
906              Ok(Box::new([<$lib R4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
907            },
908            #[cfg(all(feature = $value_string, feature = "matrixd"))]
909            (Value::[<Matrix $lhs_type>](lhs),Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
910              let (rows,cols) = {rhs.borrow().shape()};
911              let lhs_shape = lhs.shape();
912              match (lhs_shape[0],lhs_shape[1],rows,cols) {
913              // matching rows
914              (m,1,n,_) if n == m => (),
915              // matching cols
916              (1,m,_,n) if n == m => (),
917              // mismatching dimensions
918              _ => {return Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });},
919              }
920              match lhs {
921              #[cfg(feature = "vector2")]
922              Matrix::Vector2(lhs) => {
923                $registrar!([<$lib V2MD>], $target_type, $value_string);
924                Ok(Box::new([<$lib V2MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
925              },
926              #[cfg(feature = "vector3")]
927              Matrix::Vector3(lhs) => {
928                $registrar!([<$lib V3MD>], $target_type, $value_string);
929                Ok(Box::new([<$lib V3MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
930              },
931              #[cfg(feature = "vector4")]
932              Matrix::Vector4(lhs) => {
933                $registrar!([<$lib V4MD>], $target_type, $value_string);
934                Ok(Box::new([<$lib V4MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
935              },
936              #[cfg(feature = "vectord")]
937              Matrix::DVector(lhs) => {
938                $registrar!([<$lib VDMD>], $target_type, $value_string);
939                Ok(Box::new([<$lib VDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
940              },
941              #[cfg(feature = "row_vector2")]
942              Matrix::RowVector2(lhs) => {
943                $registrar!([<$lib R2MD>], $target_type, $value_string);
944                Ok(Box::new([<$lib R2MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
945              },
946              #[cfg(feature = "row_vector3")]
947              Matrix::RowVector3(lhs) => {
948                $registrar!([<$lib R3MD>], $target_type, $value_string);
949                Ok(Box::new([<$lib R3MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
950              },
951              #[cfg(feature = "row_vector4")]
952              Matrix::RowVector4(lhs) => {
953                $registrar!([<$lib R4MD>], $target_type, $value_string);
954                Ok(Box::new([<$lib R4MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
955              },
956              #[cfg(feature = "row_vectord")]
957              Matrix::RowDVector(lhs) => {
958                $registrar!([<$lib RDMD>], $target_type, $value_string);
959                Ok(Box::new([<$lib RDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
960              },
961              _ => {return Err(MechError{file: file!().to_string(),  tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });},
962              }
963            }
964          )+
965        )+
966        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
967      }
968    }
969  }
970}  
971
972#[macro_export]
973macro_rules! impl_urnop_match_arms {
974  ($lib:tt, $arg:tt, $($lhs_type:tt, $($target_type:tt, $value_string:tt),+);+ $(;)?) => {
975    paste!{
976      match $arg {
977        $(
978          $(
979            #[cfg(feature = $value_string)]
980            (Value::$lhs_type(arg)) => Ok(Box::new([<$lib S>]{arg: arg.clone(), out: Ref::new($target_type::default()), _marker: PhantomData::default() })),
981            #[cfg(all(feature = $value_string, feature = "matrix1"))]
982            (Value::[<Matrix $lhs_type>](Matrix::Matrix1(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix1::from_element($target_type::default())), _marker: PhantomData::default() })),
983            #[cfg(all(feature = $value_string, feature = "matrix2"))]
984            (Value::[<Matrix $lhs_type>](Matrix::Matrix2(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix2::from_element($target_type::default())), _marker: PhantomData::default() })),
985            #[cfg(all(feature = $value_string, feature = "matrix3"))]
986            (Value::[<Matrix $lhs_type>](Matrix::Matrix3(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix3::from_element($target_type::default())), _marker: PhantomData::default() })),
987            #[cfg(all(feature = $value_string, feature = "matrix4"))]
988            (Value::[<Matrix $lhs_type>](Matrix::Matrix4(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix4::from_element($target_type::default())), _marker: PhantomData::default() })),
989            #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
990            (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix2x3::from_element($target_type::default())), _marker: PhantomData::default() })),         
991            #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
992            (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(arg))) => Ok(Box::new([<$lib V>]{arg, out: Ref::new(Matrix3x2::from_element($target_type::default())), _marker: PhantomData::default() })),         
993            #[cfg(all(feature = $value_string, feature = "row_vector2"))]
994            (Value::[<Matrix $lhs_type>](Matrix::RowVector2(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(RowVector2::from_element($target_type::default())), _marker: PhantomData::default() })),
995            #[cfg(all(feature = $value_string, feature = "row_vector3"))]
996            (Value::[<Matrix $lhs_type>](Matrix::RowVector3(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(RowVector3::from_element($target_type::default())), _marker: PhantomData::default() })),
997            #[cfg(all(feature = $value_string, feature = "row_vector4"))]
998            (Value::[<Matrix $lhs_type>](Matrix::RowVector4(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(RowVector4::from_element($target_type::default())), _marker: PhantomData::default() })),
999            #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1000            (Value::[<Matrix $lhs_type>](Matrix::RowDVector(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(RowDVector::from_element(arg.borrow().len(),$target_type::default())), _marker: PhantomData::default() })),
1001            #[cfg(all(feature = $value_string, feature = "vector2"))]
1002            (Value::[<Matrix $lhs_type>](Matrix::Vector2(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(Vector2::from_element($target_type::default())), _marker: PhantomData::default() })),
1003            #[cfg(all(feature = $value_string, feature = "vector3"))]
1004            (Value::[<Matrix $lhs_type>](Matrix::Vector3(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(Vector3::from_element($target_type::default())), _marker: PhantomData::default() })),
1005            #[cfg(all(feature = $value_string, feature = "vector4"))]
1006            (Value::[<Matrix $lhs_type>](Matrix::Vector4(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(Vector4::from_element($target_type::default())), _marker: PhantomData::default() })),
1007            #[cfg(all(feature = $value_string, feature = "vectord"))]
1008            (Value::[<Matrix $lhs_type>](Matrix::DVector(arg))) => Ok(Box::new([<$lib V>]{arg: arg.clone(), out: Ref::new(DVector::from_element(arg.borrow().len(),$target_type::default())), _marker: PhantomData::default() })),
1009            #[cfg(all(feature = $value_string, feature = "matrixd"))]
1010            (Value::[<Matrix $lhs_type>](Matrix::DMatrix(arg))) => {
1011              let (rows,cols) = {arg.borrow().shape()};
1012              Ok(Box::new([<$lib V>]{arg, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default())), _marker: PhantomData::default() }))},
1013          )+
1014        )+
1015        x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1016      }
1017    }
1018  }
1019}
1020
1021#[macro_export]
1022macro_rules! impl_mech_binop_fxn {
1023  ($fxn_name:ident, $gen_fxn:tt) => {
1024    pub struct $fxn_name {}
1025    impl NativeFunctionCompiler for $fxn_name {
1026      fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1027        if arguments.len() != 2 {
1028          return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1029        }
1030        let lhs_value = arguments[0].clone();
1031        let rhs_value = arguments[1].clone();
1032        match $gen_fxn(lhs_value.clone(), rhs_value.clone()) {
1033          Ok(fxn) => Ok(fxn),
1034          Err(_) => {
1035            match (lhs_value,rhs_value) {
1036              (Value::MutableReference(lhs),Value::MutableReference(rhs)) => {$gen_fxn(lhs.borrow().clone(), rhs.borrow().clone())}
1037              (lhs_value,Value::MutableReference(rhs)) => { $gen_fxn(lhs_value.clone(), rhs.borrow().clone())}
1038              (Value::MutableReference(lhs),rhs_value) => { $gen_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1039              x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1040            }
1041          }
1042        }
1043      }
1044    }
1045  }
1046}
1047
1048#[macro_export]
1049macro_rules! impl_mech_urnop_fxn {
1050  ($fxn_name:ident, $gen_fxn:tt) => {
1051    pub struct $fxn_name {}
1052    impl NativeFunctionCompiler for $fxn_name {
1053      fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1054        if arguments.len() != 1 {
1055          return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1056        }
1057        let input = arguments[0].clone();
1058        match $gen_fxn(input.clone()) {
1059          Ok(fxn) => Ok(fxn),
1060          Err(_) => {
1061            match (input) {
1062              (Value::MutableReference(input)) => {$gen_fxn(input.borrow().clone())}
1063              x => Err(MechError{file: file!().to_string(),  tokens: vec![], msg: format!("{:#?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1064            }
1065          }
1066        }
1067      }
1068    }
1069  }
1070}
1071
1072#[cfg(feature = "functions")]
1073pub fn box_mech_fxn<T>(r: MResult<Box<T>>) -> MResult<Box<dyn MechFunction>>
1074where
1075  T: MechFunction + 'static,
1076{
1077  r.map(|x| x as Box<dyn MechFunction>)
1078}
1079
1080#[macro_export]
1081macro_rules! register_assign {
1082  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1083    paste! {
1084      inventory::submit! {
1085        FunctionDescriptor {
1086          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1087          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>>::new,
1088        }
1089      }
1090    }
1091  };
1092}
1093
1094#[macro_export]
1095macro_rules! register_assign_s {
1096  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1097    paste! {
1098      inventory::submit! {
1099        FunctionDescriptor {
1100          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1101          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>>::new,
1102        }
1103      }
1104    }
1105  };
1106}
1107
1108#[macro_export]
1109macro_rules! register_assign_srr {
1110  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1111    paste! {
1112      inventory::submit! {
1113        FunctionDescriptor {
1114          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1115          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>,$row3<usize>>::new,
1116        }
1117      }
1118    }
1119  };
1120}
1121
1122#[macro_export]
1123macro_rules! register_assign_srr_b {
1124  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1125    paste! {
1126      inventory::submit! {
1127        FunctionDescriptor {
1128          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1129          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>,$row3<bool>>::new,
1130        }
1131      }
1132    }
1133  };
1134}
1135
1136#[macro_export]
1137macro_rules! register_assign_srr_bu {
1138  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1139    paste! {
1140      inventory::submit! {
1141        FunctionDescriptor {
1142          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1143          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>,$row3<usize>>::new,
1144        }
1145      }
1146    }
1147  };
1148}
1149
1150#[macro_export]
1151macro_rules! register_assign_srr_ub {
1152  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1153    paste! {
1154      inventory::submit! {
1155        FunctionDescriptor {
1156          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1157          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>,$row3<bool>>::new,
1158        }
1159      }
1160    }
1161  };
1162}
1163
1164#[macro_export]
1165macro_rules! register_assign_srr_b2 {
1166  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1167    paste! {
1168      inventory::submit! {
1169        FunctionDescriptor {
1170          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1171          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>,$row4<bool>>::new,
1172        }
1173      }
1174    }
1175  };
1176}
1177
1178#[macro_export]
1179macro_rules! register_assign_srr_bu2 {
1180  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1181    paste! {
1182      inventory::submit! {
1183        FunctionDescriptor {
1184          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1185          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>,$row4<usize>>::new,
1186        }
1187      }
1188    }
1189  };
1190}
1191
1192#[macro_export]
1193macro_rules! register_assign_srr_ub2 {
1194  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1195    paste! {
1196      inventory::submit! {
1197        FunctionDescriptor {
1198          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1199          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>,$row4<bool>>::new,
1200        }
1201      }
1202    }
1203  };
1204}
1205
1206#[macro_export]
1207macro_rules! register_assign_srr2 {
1208  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1209    paste! {
1210      inventory::submit! {
1211        FunctionDescriptor {
1212          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1213          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>,$row4<usize>>::new,
1214        }
1215      }
1216    }
1217  };
1218}
1219
1220#[macro_export]
1221macro_rules! register_assign_s1 {
1222  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt) => {
1223    paste! {
1224      inventory::submit! {
1225        FunctionDescriptor {
1226          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), ">") ,
1227          ptr: $fxn_name::<$scalar,$row1<$scalar>>::new,
1228        }
1229      }
1230    }
1231  };
1232}
1233
1234#[macro_export]
1235macro_rules! register_assign_s2 {
1236  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1237    paste! {
1238      inventory::submit! {
1239        FunctionDescriptor {
1240          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1241          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>>::new,
1242        }
1243      }
1244    }
1245  };
1246}
1247
1248#[macro_export]
1249macro_rules! register_assign_b {
1250  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1251    paste! {
1252      inventory::submit! {
1253        FunctionDescriptor {
1254          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1255          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>>::new,
1256        }
1257      }
1258    }
1259  };
1260}
1261
1262#[macro_export]
1263macro_rules! register_assign_s_b {
1264  ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1265    paste! {
1266      inventory::submit! {
1267        FunctionDescriptor {
1268          name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1269          ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>>::new,
1270        }
1271      }
1272    }
1273  };
1274}
1275
1276#[macro_export]
1277macro_rules! impl_assign_fxn {
1278  ($op:tt, $fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {{
1279    let mut res: Result<_, MechError> = Err(MechError {
1280      file: file!().to_string(),
1281      tokens: vec![],
1282      msg: String::new(),
1283      id: line!(),
1284      kind: MechErrorKind::UnhandledFunctionArgumentKind,
1285    });
1286    
1287    #[cfg(feature = "row_vector2")]
1288    {
1289      res = res.or_else(|_| $op!($fxn_name, RowVector2, &$arg, $value_kind, $value_string));
1290    }
1291
1292    #[cfg(feature = "row_vector3")]
1293    {
1294      res = res.or_else(|_| $op!($fxn_name, RowVector3, &$arg, $value_kind, $value_string));
1295    }
1296
1297    #[cfg(feature = "row_vector4")]
1298    {
1299      res = res.or_else(|_| $op!($fxn_name, RowVector4, &$arg, $value_kind, $value_string));
1300    }
1301
1302    #[cfg(feature = "vector2")]
1303    {
1304      res = res.or_else(|_| $op!($fxn_name, Vector2, &$arg, $value_kind, $value_string));
1305    }
1306
1307    #[cfg(feature = "vector3")]
1308    {
1309      res = res.or_else(|_| $op!($fxn_name, Vector3, &$arg, $value_kind, $value_string));
1310    }
1311
1312    #[cfg(feature = "vector4")]
1313    {
1314      res = res.or_else(|_| $op!($fxn_name, Vector4, &$arg, $value_kind, $value_string));
1315    }
1316
1317    #[cfg(feature = "matrix1")]
1318    {
1319      res = res.or_else(|_| $op!($fxn_name, Matrix1, &$arg, $value_kind, $value_string));
1320    }
1321
1322    #[cfg(feature = "matrix2")]
1323    {
1324      res = res.or_else(|_| $op!($fxn_name, Matrix2, &$arg, $value_kind, $value_string));
1325    }
1326
1327    #[cfg(feature = "matrix3")]
1328    {
1329      res = res.or_else(|_| $op!($fxn_name, Matrix3, &$arg, $value_kind, $value_string));
1330    }
1331
1332    #[cfg(feature = "matrix4")]
1333    {
1334      res = res.or_else(|_| $op!($fxn_name, Matrix4, &$arg, $value_kind, $value_string));
1335    }
1336
1337    #[cfg(feature = "matrix2x3")]
1338    {
1339      res = res.or_else(|_| $op!($fxn_name, Matrix2x3, &$arg, $value_kind, $value_string));
1340    }
1341
1342    #[cfg(feature = "matrix3x2")]
1343    {
1344      res = res.or_else(|_| $op!($fxn_name, Matrix3x2, &$arg, $value_kind, $value_string));
1345    }
1346
1347    #[cfg(feature = "matrixd")]
1348    {
1349      res = res.or_else(|_| $op!($fxn_name, DMatrix, &$arg, $value_kind, $value_string));
1350    }
1351
1352    #[cfg(feature = "row_vectord")]
1353    {
1354      res = res.or_else(|_| $op!($fxn_name, RowDVector, &$arg, $value_kind, $value_string));
1355    }
1356
1357    #[cfg(feature = "vectord")]
1358    {
1359      res = res.or_else(|_| $op!($fxn_name, DVector, &$arg, $value_kind, $value_string));
1360    }
1361
1362    res.map_err(|_| MechError {
1363      file: file!().to_string(),
1364      tokens: vec![],
1365      msg: format!("Unsupported argument: {:?}", &$arg),
1366      id: line!(),
1367      kind: MechErrorKind::UnhandledFunctionArgumentKind,
1368    })
1369  }}
1370}
1371
1372#[macro_export]
1373macro_rules! impl_assign_scalar_arms {
1374  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1375    paste! {
1376      match $arg {
1377        // Scalar source
1378        #[cfg(all(feature = $value_string))]
1379        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
1380          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1381          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1382        },
1383        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1384      }
1385    };
1386  };
1387}
1388
1389#[macro_export]
1390macro_rules! impl_assign_all_arms {
1391  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1392    paste! {
1393      match $arg {
1394        #[cfg(feature = $value_string)]
1395        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1396          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1397          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1398        },
1399        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1400      }
1401    };
1402  };
1403}
1404
1405#[macro_export]
1406macro_rules! impl_assign_scalar_scalar_arms {
1407  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1408    paste! {
1409      match $arg {
1410        #[cfg(feature = $value_string)]
1411        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1412          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1413          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1414        },
1415        #[cfg(all(feature = $value_string, feature = "matrixd", not(feature = "matrix1")))]
1416        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DMatrix(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1417          register_assign_s!([<$fxn_name MD>], $value_kind, $value_string, $shape, DMatrix);
1418          box_mech_fxn(Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1419        },
1420        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1421      }
1422    };
1423  };
1424}
1425
1426#[macro_export]
1427macro_rules! impl_set_range_arms {
1428  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1429    paste! {
1430      match $arg {
1431        // Scalar source
1432        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1433        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
1434          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1435          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1436        },
1437        #[cfg(all(feature = $value_string, feature = "vector2"))]
1438        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
1439          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1440          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1441        },
1442        #[cfg(all(feature = $value_string, feature = "vector3"))]
1443        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
1444          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1445          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1446        },
1447        #[cfg(all(feature = $value_string, feature = "vector4"))]
1448        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
1449          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1450          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1451        },
1452        #[cfg(all(feature = $value_string, feature = "vectord"))]
1453        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
1454          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1455          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1456        },
1457        // Vector source
1458        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1459        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1460          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1461          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1462        },
1463        #[cfg(all(feature = $value_string, feature = "matrix2"))]
1464        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1465          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1466          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1467        },
1468        #[cfg(all(feature = $value_string, feature = "matrix3"))]
1469        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1470          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1471          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1472        },
1473        #[cfg(all(feature = $value_string, feature = "matrix4"))]
1474        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1475          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1476          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1477        },
1478        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1479        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
1480          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1481          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1482        },
1483        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1484        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
1485          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1486          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1487        },
1488        #[cfg(all(feature = $value_string, feature = "matrixd"))]
1489        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
1490          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1491          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1492        },
1493        #[cfg(all(feature = $value_string, feature = "vectord"))]
1494        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
1495          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1496          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1497        },
1498        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1499        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
1500          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1501          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1502        },
1503        #[cfg(all(feature = $value_string, feature = "vector2"))]
1504        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1505          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1506          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1507        },
1508        #[cfg(all(feature = $value_string, feature = "vector3"))]
1509        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1510          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1511          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1512        },
1513        #[cfg(all(feature = $value_string, feature = "vector4"))]
1514        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1515          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1516          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1517        },
1518        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1519        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1520          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1521          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1522        },
1523        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1524        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1525          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1526          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1527        },
1528        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1529        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1530          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1531          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1532        },
1533        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1534      }
1535    };
1536  };
1537}
1538
1539#[macro_export]
1540macro_rules! impl_assign_all_arms_b {
1541  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1542    paste! {
1543      match $arg {
1544        #[cfg(feature = $value_string)]
1545        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Bool(ix)], Value::[<$value_kind:camel>](source)) => {
1546          register_assign_s1!([<$fxn_name B>], $value_kind, $value_string, $shape);
1547          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1548        },
1549        // Vector source, must have equal size to output
1550        #[cfg(feature = $value_string)]
1551        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Bool(ix)], Value::[<Matrix $value_kind:camel>](Matrix::$shape(source))) => {
1552          register_assign_s2!([<$fxn_name VB>], $value_kind, $value_string, $shape, $shape);
1553          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1554        },
1555        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1556      }
1557    };
1558  };
1559}
1560
1561#[macro_export]
1562macro_rules! impl_set_range_all_arms {
1563  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1564    paste! {
1565      match $arg {
1566        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1567        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1568          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1569          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1570        },
1571        #[cfg(all(feature = $value_string, feature = "vector2"))]
1572        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1573          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1574          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1575        },
1576        #[cfg(all(feature = $value_string, feature = "vector3"))]
1577        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1578          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1579          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1580        },
1581        #[cfg(all(feature = $value_string, feature = "vector4"))]
1582        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1583          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1584          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1585        },
1586        #[cfg(all(feature = $value_string, feature = "vectord"))]
1587        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1588          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1589          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
1590        },
1591        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1592        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1593          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1594          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1595        },
1596        #[cfg(all(feature = $value_string, feature = "matrix2"))]
1597        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1598          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1599          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1600        },
1601        #[cfg(all(feature = $value_string, feature = "matrix3"))]
1602        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1603          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1604          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1605        },
1606        #[cfg(all(feature = $value_string, feature = "matrix4"))]
1607        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1608          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1609          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1610        },
1611        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1612        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
1613          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1614          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1615        },
1616        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1617        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
1618          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1619          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1620        },
1621        #[cfg(all(feature = $value_string, feature = "matrixd"))]
1622        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
1623          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1624          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1625        },
1626        #[cfg(all(feature = $value_string, feature = "vectord"))]
1627        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
1628          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1629          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1630        },
1631        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1632        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
1633          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1634          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1635        },
1636        #[cfg(all(feature = $value_string, feature = "vector2"))]
1637        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1638          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1639          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1640        },
1641        #[cfg(all(feature = $value_string, feature = "vector3"))]
1642        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1643          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1644          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1645        },
1646        #[cfg(all(feature = $value_string, feature = "vector4"))]
1647        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1648          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1649          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1650        },
1651        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1652        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1653          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1654          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1655        },
1656        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1657        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1658          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1659          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1660        },
1661        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1662        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1663          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1664          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1665        },
1666        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1667      }
1668    };
1669  };
1670}
1671
1672#[macro_export]
1673macro_rules! impl_assign_range_scalar_arms {
1674  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1675    paste! {
1676      match $arg {
1677        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1678        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1679          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1680          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1681        },
1682        #[cfg(all(feature = $value_string, feature = "vector2"))]
1683        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1684          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1685          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1686        },
1687        #[cfg(all(feature = $value_string, feature = "vector3"))]
1688        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1689          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1690          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1691        },
1692        #[cfg(all(feature = $value_string, feature = "vector4"))]
1693        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1694          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1695          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1696        },
1697        #[cfg(all(feature = $value_string, feature = "matrixd"))]
1698        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DMatrix(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1699          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DMatrix);
1700          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1701        },
1702        #[cfg(all(feature = $value_string, feature = "vectord"))]
1703        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1704          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1705          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1706        },
1707        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1708        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1709          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1710          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1711        },
1712        #[cfg(all(feature = $value_string, feature = "matrix2"))]
1713        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1714          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1715          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1716        },
1717        #[cfg(all(feature = $value_string, feature = "matrix3"))]
1718        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) if ix1.borrow().len() == source.borrow().len() => {
1719          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1720          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1721        },
1722        #[cfg(all(feature = $value_string, feature = "matrix4"))]
1723        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) if ix1.borrow().len() == source.borrow().len() => {
1724          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1725          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1726        },
1727        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1728        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) if ix1.borrow().len() == source.borrow().len() => {
1729          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1730          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1731        },
1732        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1733        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) if ix1.borrow().len() == source.borrow().len() => {
1734          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1735          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1736        },
1737        #[cfg(all(feature = $value_string, feature = "vector2"))]
1738        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1739          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1740          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1741        },
1742        #[cfg(all(feature = $value_string, feature = "vector3"))]
1743        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1744          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1745          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1746        },
1747        #[cfg(all(feature = $value_string, feature = "vector4"))]
1748        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1749          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1750          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1751        },
1752        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1753        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1754          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1755          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1756        },
1757        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1758        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1759          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1760          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1761        },
1762        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1763        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1764          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1765          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1766        },
1767        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
1768        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix1.borrow().len() == source.borrow().len() => {
1769          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1770          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1771        },
1772        #[cfg(all(feature = $value_string, feature = "vectord"))]
1773        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if ix1.borrow().len() == source.borrow().len() => {
1774          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1775          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1776        },
1777        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
1778        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if ix1.borrow().len() == source.borrow().len() => {
1779          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1780          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1781        },
1782        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1783      }
1784    };
1785  };
1786}
1787
1788#[macro_export]
1789macro_rules! impl_assign_scalar_range_arms {
1790  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1791    paste! {
1792      match $arg {
1793        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1794        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
1795          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1796          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1797        },
1798        #[cfg(all(feature = $value_string, feature = "vector2"))]
1799        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
1800          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1801          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1802        },
1803        #[cfg(all(feature = $value_string, feature = "vector3"))]
1804        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
1805          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1806          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1807        },
1808        #[cfg(all(feature = $value_string, feature = "vector4"))]
1809        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
1810          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1811          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1812        },
1813        #[cfg(all(feature = $value_string, feature = "matrixd", not(feature = "matrix1")))]
1814        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::DMatrix(ix2))], Value::[<$value_kind:camel>](source)) => {
1815          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DMatrix);
1816          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1817        },
1818        #[cfg(all(feature = $value_string, feature = "vectord"))]
1819        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
1820          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1821          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
1822        },
1823        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1824        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1825          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1826          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1827        },
1828        #[cfg(all(feature = $value_string, feature = "matrix2"))]
1829        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1830          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1831          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1832        },
1833        #[cfg(all(feature = $value_string, feature = "matrix3"))]
1834        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1835          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1836          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1837        },
1838        #[cfg(all(feature = $value_string, feature = "matrix4"))]
1839        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1840          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1841          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1842        },
1843        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1844        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) if ix2.borrow().len() == source.borrow().len() => {
1845          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1846          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1847        },
1848        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1849        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) if ix2.borrow().len() == source.borrow().len() => {
1850          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1851          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1852        },
1853        #[cfg(all(feature = $value_string, feature = "vector2"))]
1854        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1855          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1856          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1857        },
1858        #[cfg(all(feature = $value_string, feature = "vector3"))]
1859        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1860          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1861          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1862        },
1863        #[cfg(all(feature = $value_string, feature = "vector4"))]
1864        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1865          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1866          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1867        },
1868        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1869        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1870          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1871          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1872        },
1873        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1874        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1875          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1876          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1877        },
1878        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1879        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1880          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1881          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1882        },
1883        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
1884        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix2.borrow().len() == source.borrow().len() => {
1885          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1886          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1887        },
1888        #[cfg(all(feature = $value_string, feature = "vectord"))]
1889        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if ix2.borrow().len() == source.borrow().len() => {
1890          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1891          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1892        },
1893        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
1894        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if ix2.borrow().len() == source.borrow().len() => {
1895          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1896          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1897        },
1898        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1899      }
1900    };
1901  };
1902}
1903
1904pub fn check_index_lengths<Ix1, Ix2, Source, A, B, C>(ix1: &Ref<Ix1>,ix2: &Ref<Ix2>,source: &Ref<Source>) -> Result<(), MechError>
1905where
1906  Ix1: AsRef<[A]>,
1907  Ix2: AsRef<[B]>,
1908  Source: AsRef<[C]>,
1909{
1910  let ix1_len = ix1.borrow().as_ref().len();
1911  let ix2_len = ix2.borrow().as_ref().len();
1912  let source_len = source.borrow().as_ref().len();
1913  if ix1_len * ix2_len != source_len {
1914    return Err(MechError {
1915      file: file!().to_string(),
1916      tokens: vec![],
1917      msg: format!("Mismatched lengths for indexed assignment: ix1 length ({ix1_len}) * ix2 length ({ix2_len}) must equal source length ({source_len})"),
1918      id: line!(),
1919      kind: MechErrorKind::UnhandledFunctionArgumentKind,
1920    });
1921  }
1922  Ok(())
1923}
1924
1925#[macro_export]
1926macro_rules! impl_assign_range_range_arms {
1927  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1928    paste! {
1929      match $arg {
1930        // Scalar source
1931        #[cfg(all(feature = $value_string, feature = "matrix1"))]
1932        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
1933          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1934          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1935        },
1936        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2"))]
1937        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
1938          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector2);
1939          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1940        },
1941        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector3"))]
1942        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
1943          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector3);
1944          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1945        },
1946        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector4"))]
1947        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
1948          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector4);
1949          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1950        },
1951        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vectord"))]
1952        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
1953          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, DVector);
1954          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1955        },
1956        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix1"))]
1957        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
1958          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Matrix1);
1959          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1960        },
1961        #[cfg(all(feature = $value_string, feature = "vector2"))]
1962        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
1963          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector2);
1964          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1965        },
1966        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3"))]
1967        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
1968          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector3);
1969          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1970        },
1971        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4"))]
1972        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
1973          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector4);
1974          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1975        },
1976        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord"))]
1977        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
1978          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, DVector);
1979          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1980        },
1981        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1"))]
1982        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
1983          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Matrix1);
1984          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1985        },
1986        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2"))]
1987        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
1988          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector2);
1989          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1990        },
1991        #[cfg(all(feature = $value_string, feature = "vector3"))]
1992        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
1993          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector3);
1994          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1995        },
1996        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4"))]
1997        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
1998          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector4);
1999          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2000        },
2001        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord"))]
2002        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2003          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, DVector);
2004          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2005        },
2006        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1"))]
2007        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2008          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Matrix1);
2009          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2010        },
2011        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2"))]
2012        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2013          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector2);
2014          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2015        },
2016        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3"))]
2017        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2018          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector3);
2019          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2020        },
2021        #[cfg(all(feature = $value_string, feature = "vector4"))]
2022        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2023          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector4);
2024          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2025        },
2026        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2027        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2028          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, DVector);
2029          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2030        },
2031        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1"))]
2032        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2033          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Matrix1);
2034          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2035        },
2036        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2"))]
2037        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2038          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector2);
2039          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2040        },
2041        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3"))]
2042        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2043          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector3);
2044          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2045        },
2046        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4"))]
2047        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2048          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector4);
2049          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2050        },
2051        #[cfg(all(feature = $value_string, feature = "vectord"))]
2052        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2053          register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, DVector);
2054          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2055        },
2056        // Vector source
2057        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2058        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2059          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1, Matrix1);
2060          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2061        },
2062        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2"))]
2063        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2064          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Matrix1, Vector2);
2065          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2066        },
2067        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vector2"))]
2068        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2069          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Matrix1, Vector2);
2070          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2071        },
2072        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector3"))]
2073        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2074          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Matrix1, Vector3);
2075          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2076        },
2077        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vector3"))]
2078        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2079          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Matrix1, Vector3);
2080          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2081        },
2082        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector4"))]
2083        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2084          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Matrix1, Vector4);
2085          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2086        },
2087        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2", feature = "matrix2"))]
2088        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
2089          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Matrix1, Vector2);
2090          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2091        },
2092        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vector4"))]
2093        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2094          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Matrix1, Vector4);
2095          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2096        },
2097        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vectord"))]
2098        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2099          check_index_lengths(&ix1, &ix2, &source)?;
2100          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Matrix1, DVector);
2101          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2102        },
2103        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vectord"))]
2104        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2105          check_index_lengths(&ix1, &ix2, &source)?;
2106          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Matrix1, DVector);
2107          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2108        },
2109        #[cfg(all(feature = $value_string, feature = "matrix1", feature = "matrixd"))]
2110        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2111          check_index_lengths(&ix1, &ix2, &source)?;
2112          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Matrix1, DVector);
2113          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2114        },
2115        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix1", feature = "vector2"))]
2116        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2117          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2, Matrix1);
2118          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2119        },
2120        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix1", feature = "row_vector2"))]
2121        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2122          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2, Matrix1);
2123          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2124        },
2125        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4"))]
2126        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2127          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector2, Vector2);
2128          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2129        },
2130        #[cfg(all(feature = $value_string, feature = "vector2", feature = "row_vector4"))]
2131        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2132          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector2, Vector2);
2133          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2134        },
2135        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "matrix2x3"))]
2136        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
2137          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, Vector2, Vector3);
2138          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2139        },
2140        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "matrix3x2"))]
2141        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
2142          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, Vector2, Vector3);
2143          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2144        },
2145        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "vectord"))]
2146        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2147          check_index_lengths(&ix1, &ix2, &source)?;
2148          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, Vector3);
2149          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2150        },
2151        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "row_vectord"))]
2152        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2153          check_index_lengths(&ix1, &ix2, &source)?;
2154          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, Vector3);
2155          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2156        },
2157        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "vectord"))]
2158        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2159          check_index_lengths(&ix1, &ix2, &source)?;
2160          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, Vector4);
2161          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2162        },
2163        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "row_vectord"))]
2164        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2165          check_index_lengths(&ix1, &ix2, &source)?;
2166          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, Vector4);
2167          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2168        },
2169        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "matrixd"))]
2170        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2171          check_index_lengths(&ix1, &ix2, &source)?;
2172          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector2, Vector4);
2173          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2174        },
2175        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "vectord"))]
2176        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2177          check_index_lengths(&ix1, &ix2, &source)?;
2178          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, DVector);
2179          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2180        },
2181        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "row_vectord"))]
2182        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2183          check_index_lengths(&ix1, &ix2, &source)?;
2184          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, DVector);
2185          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2186        },
2187        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "matrixd"))]
2188        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2189          check_index_lengths(&ix1, &ix2, &source)?;
2190          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector2, DVector);
2191          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2192        },
2193        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1", feature = "vector3"))]
2194        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2195          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3, Matrix1);
2196          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2197        },
2198        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1", feature = "row_vector3"))]
2199        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2200          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3, Matrix1);
2201          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2202        },
2203        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "matrix2x3"))]
2204        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
2205          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, Vector3, Vector2);
2206          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2207        },
2208        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "matrix3x2"))]
2209        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
2210          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, Vector3, Vector2);
2211          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2212        },
2213        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "vectord"))]
2214        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2215          check_index_lengths(&ix1, &ix2, &source)?;
2216          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, Vector2);
2217          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2218        },
2219        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "row_vectord"))]
2220        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2221          check_index_lengths(&ix1, &ix2, &source)?;
2222          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, Vector2);
2223          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2224        },
2225        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2226        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
2227          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, Vector3, Vector3);
2228          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2229        },
2230        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord"))]
2231        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2232          check_index_lengths(&ix1, &ix2, &source)?;
2233          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, DVector);
2234          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2235        },
2236        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "row_vectord"))]
2237        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2238          check_index_lengths(&ix1, &ix2, &source)?;
2239          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, DVector);
2240          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2241        },
2242        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "vectord"))]
2243        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2244          check_index_lengths(&ix1, &ix2, &source)?;
2245          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, Vector4);
2246          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2247        },
2248        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "row_vectord"))]
2249        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2250          check_index_lengths(&ix1, &ix2, &source)?;
2251          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, Vector4);
2252          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2253        },
2254        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "matrixd"))]
2255        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2256          check_index_lengths(&ix1, &ix2, &source)?;
2257          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector3, Vector4);
2258          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2259        },
2260        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "vectord"))]
2261        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2262          check_index_lengths(&ix1, &ix2, &source)?;
2263          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, DVector);
2264          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2265        },
2266        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "row_vectord"))]
2267        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2268          check_index_lengths(&ix1, &ix2, &source)?;
2269          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, DVector);
2270          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2271        },
2272        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "matrixd"))]
2273        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2274          check_index_lengths(&ix1, &ix2, &source)?;
2275          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector3, DVector);
2276          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2277        },
2278        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1", feature = "vector4"))]
2279        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2280          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4, Matrix1);
2281          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2282        },
2283        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1", feature = "row_vector4"))]
2284        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2285          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4, Matrix1);
2286          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2287        },
2288        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1", feature = "matrix2"))]
2289        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
2290          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4, Matrix1);
2291          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2292        },
2293        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "vectord"))]
2294        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2295          check_index_lengths(&ix1, &ix2, &source)?;
2296          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector2);
2297          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2298        },
2299        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "row_vectord"))]
2300        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2301          check_index_lengths(&ix1, &ix2, &source)?;
2302          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector2);
2303          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2304        },
2305        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "matrixd"))]
2306        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2307          check_index_lengths(&ix1, &ix2, &source)?;
2308          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, Vector2);
2309          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2310        },
2311        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "vectord"))]
2312        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2313          check_index_lengths(&ix1, &ix2, &source)?;
2314          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector3);
2315          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2316        },
2317        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "row_vectord"))]
2318        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2319          check_index_lengths(&ix1, &ix2, &source)?;
2320          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector3);
2321          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2322        },
2323        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "matrixd"))]
2324        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2325          check_index_lengths(&ix1, &ix2, &source)?;
2326          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, Vector3);
2327          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2328        },
2329        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2330        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2331          check_index_lengths(&ix1, &ix2, &source)?;
2332          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector4);
2333          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2334        },
2335        #[cfg(all(feature = $value_string, feature = "vector4", feature = "row_vectord"))]
2336        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2337          check_index_lengths(&ix1, &ix2, &source)?;
2338          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector4);
2339          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2340        },
2341        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrixd"))]
2342        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2343          check_index_lengths(&ix1, &ix2, &source)?;
2344          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, DVector);
2345          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2346        },
2347        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2348        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2349          check_index_lengths(&ix1, &ix2, &source)?;
2350          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, DVector);
2351          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2352        },
2353        #[cfg(all(feature = $value_string, feature = "vector4", feature = "row_vectord"))]
2354        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2355          check_index_lengths(&ix1, &ix2, &source)?;
2356          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, DVector);
2357          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2358        },
2359        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
2360        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
2361          check_index_lengths(&ix1, &ix2, &source)?;
2362          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, Vector4, Vector4);
2363          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2364        },
2365        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "vectord"))]
2366        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2367          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Matrix1);
2368          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2369        },
2370        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "row_vectord"))]
2371        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2372          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Matrix1);
2373          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2374        },
2375        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "matrixd"))]
2376        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2377          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Matrix1);
2378          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2379        },
2380        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "vectord"))]
2381        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2382          check_index_lengths(&ix1, &ix2, &source)?;
2383          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector2);
2384          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2385        },
2386        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "row_vectord"))]
2387        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2388          check_index_lengths(&ix1, &ix2, &source)?;
2389          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector2);
2390          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2391        },
2392        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "matrixd"))]
2393        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2394          check_index_lengths(&ix1, &ix2, &source)?;
2395          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector2);
2396          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2397        },
2398        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "vectord"))]
2399        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2400          check_index_lengths(&ix1, &ix2, &source)?;
2401          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector3);
2402          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2403        },
2404        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "row_vectord"))]
2405        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2406          check_index_lengths(&ix1, &ix2, &source)?;
2407          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector3);
2408          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2409        },
2410        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "matrixd"))]
2411        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2412          check_index_lengths(&ix1, &ix2, &source)?;
2413          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector3);
2414          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2415        },
2416        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "vectord"))]
2417        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2418          check_index_lengths(&ix1, &ix2, &source)?;
2419          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector4);
2420          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2421        },
2422        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "row_vectord"))]
2423        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2424          check_index_lengths(&ix1, &ix2, &source)?;
2425          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector4);
2426          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2427        },
2428        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "matrixd"))]
2429        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2430          check_index_lengths(&ix1, &ix2, &source)?;
2431          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector4);
2432          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2433        },
2434        #[cfg(all(feature = $value_string, feature = "vectord"))]
2435        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2436          check_index_lengths(&ix1, &ix2, &source)?;
2437          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, DVector);
2438          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2439        },
2440        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
2441        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2442          check_index_lengths(&ix1, &ix2, &source)?;
2443          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, DVector);
2444          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2445        },
2446        #[cfg(all(feature = $value_string, feature = "vectord", feature = "row_vectord"))]
2447        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2448          check_index_lengths(&ix1, &ix2, &source)?;
2449          register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, DVector);
2450          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2451        },
2452        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
2453      }
2454    };
2455  };
2456}
2457
2458#[macro_export]
2459macro_rules! impl_assign_all_range_arms {
2460  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
2461    paste! {
2462      match $arg {
2463        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2464        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
2465          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
2466          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2467        },
2468        #[cfg(all(feature = $value_string, feature = "vector2"))]
2469        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
2470          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
2471          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2472        },
2473        #[cfg(all(feature = $value_string, feature = "vector3"))]
2474        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
2475          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
2476          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2477        },
2478        #[cfg(all(feature = $value_string, feature = "vector4"))]
2479        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
2480          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
2481          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2482        },
2483        #[cfg(all(feature = $value_string, feature = "vectord"))]
2484        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2485          register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
2486          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2487        },
2488        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2489        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2490          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
2491          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2492        },
2493        #[cfg(all(feature = $value_string, feature = "matrix2"))]
2494        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
2495          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
2496          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2497        },
2498        #[cfg(all(feature = $value_string, feature = "matrix3"))]
2499        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
2500          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
2501          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2502        },
2503        #[cfg(all(feature = $value_string, feature = "matrix4"))]
2504        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
2505          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
2506          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2507        },
2508        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2509        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
2510          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
2511          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2512        },
2513        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2514        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
2515          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
2516          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2517        },
2518        #[cfg(all(feature = $value_string, feature = "matrixd"))]
2519        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2520          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
2521          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2522        },
2523        #[cfg(all(feature = $value_string, feature = "vectord"))]
2524        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2525          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
2526          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2527        },
2528        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2529        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2530          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
2531          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2532        },
2533        #[cfg(all(feature = $value_string, feature = "vector2"))]
2534        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2535          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
2536          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2537        },
2538        #[cfg(all(feature = $value_string, feature = "vector3"))]
2539        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2540          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
2541          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2542        },
2543        #[cfg(all(feature = $value_string, feature = "vector4"))]
2544        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2545          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
2546          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2547        },
2548        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2549        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2550          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
2551          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2552        },
2553        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2554        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2555          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
2556          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2557        },
2558        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2559        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2560          register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
2561          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2562        },
2563        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
2564      }
2565    };
2566  };
2567}
2568
2569#[macro_export]
2570macro_rules! impl_assign_all_scalar_arms {
2571  ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
2572    paste! {
2573      match $arg {
2574        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2575        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2576          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix1);
2577          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2578        },
2579        #[cfg(all(feature = $value_string, feature = "matrix2"))]
2580        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2581          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2);
2582          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2583        },
2584        #[cfg(all(feature = $value_string, feature = "matrix3"))]
2585        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2586          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3);
2587          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2588        },
2589        #[cfg(all(feature = $value_string, feature = "matrix4"))]
2590        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2591          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix4);
2592          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2593        },
2594        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2595        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2596          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2x3);
2597          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2598        },
2599        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2600        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2601          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3x2);
2602          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2603        },
2604        #[cfg(all(feature = $value_string, feature = "matrixd"))]
2605        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2606          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DMatrix);
2607          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2608        },
2609        #[cfg(all(feature = $value_string, feature = "vectord"))]
2610        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2611          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DVector);
2612          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2613        },
2614        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2615        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2616          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowDVector);
2617          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2618        },
2619        #[cfg(all(feature = $value_string, feature = "vector2"))]
2620        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2621          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector2);
2622          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2623        },
2624        #[cfg(all(feature = $value_string, feature = "vector3"))]
2625        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2626          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector3);
2627          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2628        },
2629        #[cfg(all(feature = $value_string, feature = "vector4"))]
2630        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2631          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector4);
2632          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2633        },
2634        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2635        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2636          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector2);
2637          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2638        },
2639        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2640        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2641          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector3);
2642          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2643        },
2644        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2645        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2646          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector4);
2647          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2648        },
2649        // Vector source
2650        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2651        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2652          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix1, Matrix1);
2653          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2654        },
2655        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
2656        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2657          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, RowVector2);
2658          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2659        },
2660        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2"))]
2661        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2662          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, Vector2);
2663          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2664        },
2665        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
2666        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2667          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, RowVector3);
2668          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2669        },
2670        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2671        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2672          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, Vector3);
2673          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2674        },
2675        #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
2676        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2677          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, RowVector4);
2678          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2679        },
2680        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
2681        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2682          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, Vector4);
2683          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2684        },
2685        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2x3"))]
2686        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2687          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, RowVector2);
2688          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2689        },
2690        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2x3"))]
2691        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2692          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, Vector2);
2693          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2694        },
2695        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3x2"))]
2696        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2697          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, RowVector3);
2698          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2699        },
2700        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3x2"))]
2701        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2702          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, Vector3);
2703          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2704        },
2705        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
2706        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if sink.borrow().nrows() == source.borrow().len() => {
2707          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, DVector);
2708          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2709        },
2710        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrixd"))]
2711        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if sink.borrow().nrows() == source.borrow().len() => {
2712          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, RowDVector);
2713          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2714        },
2715        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
2716      }
2717    };
2718  };
2719}
2720
2721#[macro_export]
2722macro_rules! impl_assign_scalar_all_arms {
2723  ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
2724    paste! {
2725      match $arg {
2726        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2727        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2728          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix1);
2729          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2730        },
2731        #[cfg(all(feature = $value_string, feature = "matrix2"))]
2732        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2733          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2);
2734          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2735        },
2736        #[cfg(all(feature = $value_string, feature = "matrix3"))]
2737        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2738          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3);
2739          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2740        },
2741        #[cfg(all(feature = $value_string, feature = "matrix4"))]
2742        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2743          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix4);
2744          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2745        },
2746        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2747        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2748          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2x3);
2749          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2750        },
2751        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2752        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2753          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3x2);
2754          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2755        },
2756        #[cfg(all(feature = $value_string, feature = "matrixd"))]
2757        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2758          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DMatrix);
2759          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2760        },
2761        #[cfg(all(feature = $value_string, feature = "vectord"))]
2762        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2763          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DVector);
2764          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2765        },
2766        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2767        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2768          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowDVector);
2769          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2770        },
2771        #[cfg(all(feature = $value_string, feature = "vector2"))]
2772        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2773          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector2);
2774          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2775        },
2776        #[cfg(all(feature = $value_string, feature = "vector3"))]
2777        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2778          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector3);
2779          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2780        },
2781        #[cfg(all(feature = $value_string, feature = "vector4"))]
2782        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2783          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector4);
2784          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2785        },
2786        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2787        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2788          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector2);
2789          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2790        },
2791        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2792        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2793          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector3);
2794          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2795        },
2796        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2797        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2798          register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector4);
2799          box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2800        },
2801        // Vector source
2802        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2803        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2804          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix1, Matrix1);
2805          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2806        },
2807        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
2808        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2809          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, RowVector2);
2810          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2811        },
2812        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2"))]
2813        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2814          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, Vector2);
2815          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2816        },
2817        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
2818        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2819          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, RowVector3);
2820          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2821        },
2822        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2823        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2824          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, Vector3);
2825          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2826        },
2827        #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
2828        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2829          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, RowVector4);
2830          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2831        },
2832        #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
2833        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2834          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, Vector4);
2835          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2836        },
2837        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix2x3"))]
2838        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2839          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, RowVector3);
2840          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2841        },
2842        #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix2x3"))]
2843        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2844          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, Vector3);
2845          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2846        },
2847        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix3x2"))]
2848        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2849          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, RowVector2);
2850          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2851        },
2852        #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix3x2"))]
2853        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2854          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, Vector2);
2855          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2856        },
2857        #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
2858        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if sink.borrow().ncols() == source.borrow().len() => {
2859          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, DVector);
2860          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2861        },
2862        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrixd"))]
2863        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if sink.borrow().ncols() == source.borrow().len() => {
2864          register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, RowDVector);
2865          box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2866        },
2867        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
2868      }
2869    };
2870  };
2871}
2872
2873#[macro_export]
2874macro_rules! impl_set_all_range_arms_b {
2875  ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
2876    paste! {
2877      match $arg {
2878        // Scalar source
2879        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2880        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
2881          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
2882          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2883        },
2884        #[cfg(all(feature = $value_string, feature = "matrix2"))]
2885        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
2886          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector4);
2887          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2888        },
2889        #[cfg(all(feature = $value_string, feature = "matrix3"))]
2890        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2891          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, DVector);
2892          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2893        },
2894        #[cfg(all(feature = $value_string, feature = "matrix4"))]
2895        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2896          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, DVector);
2897          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2898        },
2899        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2900        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2901          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, DVector);
2902          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2903        },
2904        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2905        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2906          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, DVector);
2907          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2908        },
2909        #[cfg(all(feature = $value_string, feature = "matrixd"))]
2910        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2911          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, DVector);
2912          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2913        },
2914        #[cfg(all(feature = $value_string, feature = "vector2"))]
2915        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
2916          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
2917          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2918        },
2919        #[cfg(all(feature = $value_string, feature = "vector3"))]
2920        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
2921          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
2922          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2923        },
2924        #[cfg(all(feature = $value_string, feature = "vector4"))]
2925        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
2926          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
2927          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2928        },
2929        #[cfg(all(feature = $value_string, feature = "vectord"))]
2930        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) if sink.borrow().len() == ix.borrow().len() => {
2931          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
2932          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2933        },
2934        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2935        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
2936          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
2937          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2938        },
2939        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2940        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
2941          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
2942          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2943        },
2944        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2945        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
2946          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
2947          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2948        },
2949        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2950        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) if sink.borrow().len() == ix.borrow().len() => {
2951          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
2952          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
2953        },
2954        // Vector source
2955        #[cfg(all(feature = $value_string, feature = "matrix1"))]
2956        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2957          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
2958          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2959        },
2960        #[cfg(all(feature = $value_string, feature = "matrix2"))]
2961        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
2962          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, Vector2);
2963          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2964        },
2965        #[cfg(all(feature = $value_string, feature = "matrix3"))]
2966        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
2967          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, Vector3);
2968          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2969        },
2970        #[cfg(all(feature = $value_string, feature = "matrix4"))]
2971        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
2972          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, Vector4);
2973          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2974        },
2975        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2976        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
2977          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, Vector3);
2978          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2979        },
2980        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2981        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
2982          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, Vector2);
2983          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2984        },
2985        #[cfg(all(feature = $value_string, feature = "matrixd"))]
2986        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().ncols() == source.borrow().ncols() && sink.borrow().nrows() == source.borrow().nrows() && ix.borrow().len() == source.borrow().ncols() => {
2987          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
2988          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2989        },
2990        #[cfg(all(feature = $value_string, feature = "vectord"))]
2991        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if sink.borrow().len() == source.borrow().len() && sink.borrow().len() == ix.borrow().len() => {
2992          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
2993          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2994        },
2995        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2996        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if sink.borrow().len() == source.borrow().len() && sink.borrow().len() == ix.borrow().len() => {
2997          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
2998          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2999        },
3000        #[cfg(all(feature = $value_string, feature = "vector2"))]
3001        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3002          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector2, Vector2, Vector2);
3003          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3004        },
3005        #[cfg(all(feature = $value_string, feature = "vector3"))]
3006        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3007          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector3, Vector3, Vector3);
3008          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3009        },
3010        #[cfg(all(feature = $value_string, feature = "vector4"))]
3011        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3012          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector4, Vector4, Vector4);
3013          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3014        },
3015        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3016        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3017          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector2, RowVector2, Vector2);
3018          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3019        },
3020        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3021        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3022          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector3, RowVector3, Vector3);
3023          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3024        },
3025        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3026        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3027          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector4, RowVector4, Vector4);
3028          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3029        },
3030        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3031      }
3032    }
3033  }
3034}
3035
3036#[macro_export]
3037macro_rules! impl_set_range_all_arms_b {
3038  ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
3039    paste! {
3040      match $arg {
3041        // Scalar source
3042        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3043        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::MatrixBool(Matrix::Matrix1(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3044          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
3045          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3046        },
3047        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3048        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3049          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector2);
3050          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3051        },
3052        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3053        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3054          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, Vector3);
3055          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3056        },
3057        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3058        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::MatrixBool(Matrix::Vector4(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3059          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, Vector4);
3060          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3061        },
3062        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3063        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3064          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, Vector2);
3065          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3066        },
3067        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3068        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3069          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, Vector3);
3070          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3071        },
3072        #[cfg(all(feature = $value_string, feature = "matrixd"))]
3073        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3074          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, DVector);
3075          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3076        },
3077        #[cfg(all(feature = $value_string, feature = "vector2"))]
3078        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3079          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
3080          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3081        },
3082        #[cfg(all(feature = $value_string, feature = "vector3"))]
3083        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3084          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
3085          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3086        },
3087        #[cfg(all(feature = $value_string, feature = "vector4"))]
3088        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3089          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
3090          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3091        },
3092        #[cfg(all(feature = $value_string, feature = "vectord"))]
3093        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if sink.borrow().len() == ix.borrow().len() => {
3094          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
3095          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3096        },
3097        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3098        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3099          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
3100          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3101        },
3102        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3103        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3104          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
3105          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3106        },
3107        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3108        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if ix.borrow().len() == sink.borrow().nrows() => {
3109          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
3110          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3111        },
3112        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3113        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<$value_kind:camel>](source)) if sink.borrow().len() == ix.borrow().len() => {
3114          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
3115          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3116        },
3117        // Vector source
3118        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3119        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3120          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3121          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3122        },
3123        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3124        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3125          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, Vector2);
3126          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3127        },
3128        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3129        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3130          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, Vector3);
3131          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3132        },
3133        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3134        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::Vector4(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3135          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, Vector4);
3136          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3137        },
3138        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3139        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::Vector2(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3140          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, Vector2);
3141          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3142        },
3143        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3144        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::Vector3(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) if ix.borrow().len() == sink.borrow().nrows() => {
3145          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, Vector3);
3146          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3147        },
3148        #[cfg(all(feature = $value_string, feature = "matrixd"))]
3149        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().ncols() == source.borrow().ncols() && sink.borrow().nrows() == source.borrow().nrows() && ix.borrow().len() == sink.borrow().nrows() => {
3150          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
3151          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3152        },
3153        #[cfg(all(feature = $value_string, feature = "vectord"))]
3154        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if sink.borrow().len() == source.borrow().len() && sink.borrow().len() == ix.borrow().len() => {
3155          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
3156          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3157        },
3158        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3159        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::MatrixBool(Matrix::DVector(ix)), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if sink.borrow().len() == source.borrow().len() && sink.borrow().len() == ix.borrow().len() => {
3160          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
3161          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3162        },
3163        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3164      }
3165    }
3166  }
3167}
3168
3169#[macro_export]
3170macro_rules! impl_set_range_arms_b {
3171  ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
3172    paste! {
3173      match $arg {
3174        // Scalar source
3175        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3176        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
3177          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
3178          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3179        },
3180        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3181        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3182          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector4);
3183          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3184        },
3185        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3186        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3187          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, DVector);
3188          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3189        },
3190        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3191        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3192          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, DVector);
3193          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3194        },
3195        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3196        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3197          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, DVector);
3198          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3199        },
3200        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3201        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3202          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, DVector);
3203          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3204        },
3205        #[cfg(all(feature = $value_string, feature = "matrixd"))]
3206        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3207          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, DVector);
3208          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3209        },
3210        #[cfg(all(feature = $value_string, feature = "vector2"))]
3211        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3212          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
3213          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3214        },
3215        #[cfg(all(feature = $value_string, feature = "vector3"))]
3216        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3217          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
3218          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3219        },
3220        #[cfg(all(feature = $value_string, feature = "vector4"))]
3221        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3222          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
3223          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3224        },
3225        #[cfg(all(feature = $value_string, feature = "vectord"))]
3226        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3227          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
3228          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3229        },
3230        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3231        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3232          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
3233          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3234        },
3235        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3236        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3237          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
3238          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3239        },
3240        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3241        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3242          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
3243          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3244        },
3245        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3246        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3247          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
3248          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3249        },
3250        // Vector source, must have equal size to output
3251        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3252        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3253          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3254          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3255        },
3256        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3257        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3258          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, Vector4);
3259          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3260        },
3261        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3262        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
3263          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, DVector);
3264          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3265        },
3266        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3267        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
3268          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, DVector);
3269          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3270        },
3271        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3272        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
3273          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, DVector);
3274          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3275        },
3276        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3277        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
3278          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, DVector);
3279          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3280        },
3281        #[cfg(all(feature = $value_string, feature = "matrixd"))]
3282        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
3283          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
3284          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3285        },
3286        #[cfg(all(feature = $value_string, feature = "vectord"))]
3287        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
3288          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
3289          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3290        },
3291        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3292        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
3293          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
3294          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3295        },
3296        #[cfg(all(feature = $value_string, feature = "vector2"))]
3297        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3298          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector2, Vector2, Vector2);
3299          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3300        },
3301        #[cfg(all(feature = $value_string, feature = "vector3"))]
3302        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3303          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector3, Vector3, Vector3);
3304          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3305        },
3306        #[cfg(all(feature = $value_string, feature = "vector4"))]
3307        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3308          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector4, Vector4, Vector4);
3309          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3310        },
3311        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3312        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3313          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector2, RowVector2, Vector2);
3314          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3315        },
3316        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3317        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3318          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector3, RowVector3, Vector3);
3319          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3320        },
3321        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3322        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3323          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector4, RowVector4, Vector4);
3324          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3325        },
3326        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3327      }
3328    };
3329  };
3330}
3331
3332#[macro_export]
3333macro_rules! impl_assign_scalar_arms_b {
3334  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3335    paste! {
3336      match $arg {
3337        #[cfg(feature = $value_string)]
3338        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Bool(ix)], Value::[<$value_kind:camel>](source)) => {
3339          register_assign_s1!([<$fxn_name B>], $value_kind, $value_string, $shape);
3340          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))           
3341        },
3342        // Vector source, must have equal size to output
3343        #[cfg(feature = $value_string)]
3344        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Bool(ix)], Value::[<Matrix $value_kind:camel>](Matrix::$shape(source))) => {
3345          register_assign_s2!([<$fxn_name VB>], $value_kind, $value_string, $shape, $shape);
3346          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3347        },
3348        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3349      }
3350    };
3351  };
3352}
3353
3354#[macro_export]
3355macro_rules! impl_assign_range_scalar_arms_b {
3356  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3357    paste! {
3358      match $arg {
3359        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3360        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3361          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Matrix1);
3362          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
3363        },
3364        #[cfg(all(feature = $value_string, feature = "vector2"))]
3365        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3366          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector2);
3367          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
3368        },
3369        #[cfg(all(feature = $value_string, feature = "vector3"))]
3370        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3371          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector3);
3372          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
3373        },
3374        #[cfg(all(feature = $value_string, feature = "vector4"))]
3375        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3376          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector4);
3377          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
3378        },
3379        #[cfg(all(feature = $value_string, feature = "vectord"))]
3380        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3381          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, DVector);
3382          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))           
3383        },
3384        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3385        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3386          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
3387          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3388        },
3389        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3390        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3391          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2, Vector4);
3392          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3393        },
3394        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3395        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) if ix1.borrow().len() == source.borrow().len() => {
3396          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3, DVector);
3397          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3398        },
3399        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3400        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) if ix1.borrow().len() == source.borrow().len() => {
3401          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix4, DVector);
3402          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3403        },
3404        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3405        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) if ix1.borrow().len() == source.borrow().len() => {
3406          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
3407          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3408        },
3409        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3410        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) if ix1.borrow().len() == source.borrow().len() => {
3411          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
3412          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3413        },
3414        #[cfg(all(feature = $value_string, feature = "vector2"))]
3415        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3416          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector2, Vector2);
3417          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3418        },
3419        #[cfg(all(feature = $value_string, feature = "vector3"))]
3420        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3421          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector3, Vector3);
3422          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3423        },
3424        #[cfg(all(feature = $value_string, feature = "vector4"))]
3425        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3426          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector4, Vector4);
3427          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3428        },
3429        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3430        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3431          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector2, Vector2);
3432          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3433        },
3434        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3435        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3436          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector3, Vector3);
3437          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3438        },
3439        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3440        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3441          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector4, Vector4);
3442          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3443        },
3444        #[cfg(all(feature = $value_string, feature = "vectord"))]
3445        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if ix1.borrow().len() == source.borrow().len() => {
3446          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DVector, DVector);
3447          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3448        },
3449        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
3450        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if ix1.borrow().len() == source.borrow().len() => {
3451          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowDVector, DVector);
3452          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3453        },
3454        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
3455        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix1.borrow().len() == source.borrow().len() => {
3456          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DMatrix, DVector);
3457          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3458        },
3459        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3460      }
3461    };
3462  };
3463}
3464
3465#[macro_export]
3466macro_rules! impl_assign_scalar_range_arms_b {
3467  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3468    paste! {
3469      match $arg {
3470        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3471        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3472          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Matrix1);
3473          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))           
3474        },
3475        #[cfg(all(feature = $value_string, feature = "vector2"))]
3476        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3477          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector2);
3478          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))           
3479        },
3480        #[cfg(all(feature = $value_string, feature = "vector3"))]
3481        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3482          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector3);
3483          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))           
3484        },
3485        #[cfg(all(feature = $value_string, feature = "vector4"))]
3486        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3487          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector4);
3488          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))           
3489        },    
3490        #[cfg(all(feature = $value_string, feature = "vectord"))]
3491        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) if ix2.borrow().len() == sink.borrow().ncols() => {
3492          register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, DVector);
3493          box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))           
3494        },
3495        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3496        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3497          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
3498          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3499        },
3500        #[cfg(all(feature = $value_string, feature = "matrix2"))]
3501        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3502          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2, Vector4);
3503          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3504        },
3505        #[cfg(all(feature = $value_string, feature = "matrix3"))]
3506        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) if ix2.borrow().len() == source.borrow().len() && ix2.borrow().len() == sink.borrow().ncols() => {
3507          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3, DVector);
3508          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3509        },
3510        #[cfg(all(feature = $value_string, feature = "matrix4"))]
3511        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) if ix2.borrow().len() == source.borrow().len() && ix2.borrow().len() == sink.borrow().ncols() => {
3512          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix4, DVector);
3513          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3514        },
3515        #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3516        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) if ix2.borrow().len() == source.borrow().len() && ix2.borrow().len() == sink.borrow().ncols() => {
3517          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
3518          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3519        },
3520        #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3521        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) if ix2.borrow().len() == source.borrow().len() && ix2.borrow().len() == sink.borrow().ncols() => {
3522          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
3523          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3524        },
3525        #[cfg(all(feature = $value_string, feature = "vector2"))]
3526        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3527          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector2, Vector2);
3528          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3529        },
3530        #[cfg(all(feature = $value_string, feature = "vector3"))]
3531        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3532          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector3, Vector3);
3533          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3534        },
3535        #[cfg(all(feature = $value_string, feature = "vector4"))]
3536        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3537          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector4, Vector4);
3538          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3539        },
3540        #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3541        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3542          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector2, Vector2);
3543          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3544        },
3545        #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3546        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3547          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector3, Vector3);
3548          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3549        },
3550        #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3551        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3552          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector4, Vector4);
3553          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3554        },
3555        #[cfg(all(feature = $value_string, feature = "vectord"))]
3556        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if ix2.borrow().len() == sink.borrow().ncols() && ix2.borrow().len() == source.borrow().len() => {
3557          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DVector, DVector);
3558          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3559        },
3560        #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3561        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if ix2.borrow().len() == sink.borrow().ncols() && ix2.borrow().len() == source.borrow().len() => {
3562          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowDVector, DVector);
3563          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3564        },
3565        #[cfg(all(feature = $value_string, feature = "matrixd"))]
3566        (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix2.borrow().len() == sink.borrow().ncols() && ix2.borrow().len() == source.borrow().len() => {
3567          register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DMatrix, DVector);
3568          box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3569        },
3570        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3571      }
3572    };
3573  };
3574}
3575
3576#[macro_export]
3577macro_rules! impl_assign_range_range_arms_b {
3578  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3579    paste! {
3580      match $arg {
3581        // Scalar source
3582        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3583        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3584          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3585          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3586        },
3587        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix1", feature = "row_vector2"))]
3588        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3589          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector2, Matrix1, Vector2);
3590          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3591        },
3592        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix1", feature = "row_vector3"))]
3593        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3594          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector3, Matrix1, Vector3);
3595          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3596        },
3597        #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix1", feature = "row_vector4"))]
3598        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3599          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector4, Matrix1, Vector4);
3600          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3601        },
3602        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrix1", feature = "row_vectord"))]
3603        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) if ix2.borrow().len() == sink.borrow().len() => {
3604          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowDVector,Matrix1,DVector);
3605          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3606        },
3607        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector2", feature = "matrix1"))]
3608        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3609          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector2,Vector2,Matrix1);
3610          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3611        },
3612        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector3", feature = "matrix1"))]
3613        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3614          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector3,Vector3,Matrix1);
3615          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3616        },
3617        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector4", feature = "matrix1"))]
3618        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3619          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector4,Vector4,Matrix1);
3620          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3621        },
3622        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vectord", feature = "matrix1"))]
3623        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) if ix1.borrow().len() == sink.borrow().len() => {
3624          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DVector,DVector,Matrix1);
3625          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3626        },
3627        #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
3628        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3629          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2,Vector2,Vector2);
3630          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3631        },
3632        #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
3633        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3634          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2,Matrix3,Vector3);
3635          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3636        },
3637        #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
3638        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3639          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix4,Vector4,Vector4);
3640          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3641        },
3642        #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector3", feature = "vector2"))]
3643        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3644          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2x3,Vector2,Vector3);
3645          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3646        },
3647        #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector2", feature = "vector3"))]
3648        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3649          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix3x2,Vector3,Vector2);
3650          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3651        },
3652        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector4", feature = "vector2"))]
3653        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) if sink.borrow().nrows() == 4 && sink.borrow().ncols() == 2 => {
3654          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, Vector4, Vector2);
3655          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3656        },
3657        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector2", feature = "vector4"))]
3658        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) if sink.borrow().nrows() == 2 && sink.borrow().ncols() == 4 => {
3659          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, Vector2, Vector4);
3660          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3661        },
3662        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector2"))]
3663        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) if sink.borrow().ncols() == 2 && ix1.borrow().len() == sink.borrow().nrows() => {
3664          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector2);
3665          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3666        },
3667        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector3"))]
3668        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) if sink.borrow().ncols() == 3 && ix1.borrow().len() == sink.borrow().nrows() => {
3669          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector3);
3670          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3671        },
3672        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector4"))]
3673        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) if sink.borrow().ncols() == 4 && ix1.borrow().len() == sink.borrow().nrows() => {
3674          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector4);
3675          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3676        },
3677        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3678        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) if ix1.borrow().len() == sink.borrow().nrows() && ix2.borrow().len() == sink.borrow().ncols() => {
3679          register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, DVector);
3680          box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3681        },
3682        // Vector source
3683        #[cfg(all(feature = $value_string, feature = "matrix1"))]
3684        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3685          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1, Matrix1);
3686          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3687        },
3688        #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix1", feature = "row_vector2"))]
3689        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3690          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector2, RowVector2, Matrix1, Vector2);
3691          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3692        },
3693        #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix1", feature = "row_vector3"))]
3694        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3695          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector3, RowVector3, Matrix1, Vector3);
3696          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3697        },
3698        #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix1", feature = "row_vector4"))]
3699        (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3700          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector4, RowVector4, Matrix1, Vector4);
3701          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3702        },
3703        #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrix1", feature = "row_vectord"))]
3704        (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) if ix2.borrow().len() == sink.borrow().len() && ix2.borrow().len() == source.borrow().len() => {
3705          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowDVector, RowDVector, Matrix1, DVector);
3706          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3707        },
3708        #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector2", feature = "matrix1"))]
3709        (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3710          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector2, Vector2, Vector2, Matrix1);
3711          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3712        },
3713        #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector3", feature = "matrix1"))]
3714        (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3715          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector3, Vector3, Vector3, Matrix1);
3716          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3717        },
3718        #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector4", feature = "matrix1"))]
3719        (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3720          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector4, Vector4, Vector4, Matrix1);
3721          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3722        },
3723        #[cfg(all(feature = $value_string, feature = "vectord", feature = "vectord", feature = "matrix1"))]
3724        (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) if ix1.borrow().len() == sink.borrow().len() && ix2.borrow().len() == source.borrow().len() => {
3725          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DVector, DVector, DVector, Matrix1);
3726          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3727        },
3728        #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
3729        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3730          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix2, Matrix2, Vector2, Vector2);
3731          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3732        },
3733        #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
3734        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
3735          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix3, Matrix3, Vector3, Vector3);
3736          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3737        },
3738        #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
3739        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
3740          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix4, Matrix4, Vector4, Vector4);
3741          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3742        },
3743        #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector3", feature = "vector2"))]
3744        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
3745          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, Vector2, Vector3);
3746          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3747        },
3748        #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector2", feature = "vector3"))]
3749        (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
3750          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, Vector3, Vector2);
3751          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3752        },
3753        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector4", feature = "vector2"))]
3754        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().nrows() == 4 && sink.borrow().ncols() == 2 && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3755          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, Vector4, Vector2);
3756          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3757        },
3758        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector2", feature = "vector4"))]
3759        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().nrows() == 2 && sink.borrow().ncols() == 4 && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3760          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, Vector2, Vector4);
3761          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3762        },
3763        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector2"))]
3764        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().ncols() == 2 && ix1.borrow().len() == sink.borrow().nrows() && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3765          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector2);
3766          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3767        },
3768        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector3"))]
3769        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().ncols() == 3 && ix1.borrow().len() == sink.borrow().nrows() && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3770          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector3);
3771          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3772        },
3773        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector4"))]
3774        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if sink.borrow().ncols() == 4 && ix1.borrow().len() == sink.borrow().nrows() && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3775          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector4);
3776          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3777        },
3778        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3779        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix1.borrow().len() == sink.borrow().nrows() && ix2.borrow().len() == sink.borrow().ncols() && source.borrow().nrows() == ix1.borrow().len() && source.borrow().ncols() == ix2.borrow().len() => {
3780          register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
3781          box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3782        },
3783        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3784      }
3785    }
3786  }
3787}
3788
3789#[macro_export]
3790macro_rules! impl_assign_range_range_arms_bu {
3791  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3792    paste! {
3793      match $arg {
3794        // Scalar source
3795        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3796        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) if ix1.borrow().len() == sink.borrow().nrows() => {
3797          register_assign_srr_bu!([<$fxn_name BU>], $value_kind, $value_string, DMatrix, DVector, DVector);
3798          box_mech_fxn(Ok(Box::new([<$fxn_name BU>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3799        },
3800        // Vector source
3801        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3802        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix1.borrow().len() == sink.borrow().nrows() && ix1.borrow().len() == source.borrow().nrows() => {
3803          register_assign_srr_bu2!([<$fxn_name VBU>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
3804          box_mech_fxn(Ok(Box::new([<$fxn_name VBU>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3805        },
3806        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3807      }
3808    }
3809  }
3810}
3811
3812#[macro_export]
3813macro_rules! impl_assign_range_range_arms_ub {
3814  ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3815    paste! {
3816      match $arg {
3817        // Scalar-per-column source (UB)
3818        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3819        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) if ix2.borrow().len() == sink.borrow().ncols() => {
3820          register_assign_srr_ub!([<$fxn_name UB>], $value_kind, $value_string, DMatrix, DVector, DVector);
3821          box_mech_fxn(Ok(Box::new([<$fxn_name UB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3822        },
3823        // Vector-per-column source (VUB)
3824        #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3825        (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixBool(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) if ix2.borrow().len() == sink.borrow().ncols() && ix2.borrow().len() == source.borrow().ncols() => {
3826          register_assign_srr_ub2!([<$fxn_name VUB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
3827          box_mech_fxn(Ok(Box::new([<$fxn_name VUB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3828        },
3829        _ => Err(MechError { file: file!().to_string(), tokens: vec![], msg: "Unhandled argument pattern".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
3830      }
3831    }
3832  }
3833}