1pub use crate::*;
2
3#[macro_export]
12macro_rules! register_descriptor {
13 ($descriptor:expr) => {
14 #[cfg(not(target_arch = "wasm32"))]
15 inventory::submit!{ $descriptor }
16
17 #[cfg(target_arch = "wasm32")]
18 const _: () = {
19 let _ = &$descriptor;
21 };
22 };
23}
24
25
26#[macro_export]
27macro_rules! compile_register_brrw {
28 ($reg:expr, $ctx:ident) => {
29 {
30 let addr = $reg.addr();
31 let reg = $ctx.alloc_register_for_ptr(addr);
32 let borrow = $reg.borrow();
33 let const_id = borrow.compile_const($ctx).unwrap();
34 $ctx.emit_const_load(reg, const_id);
35 reg
36 }
37 };
38}
39
40#[macro_export]
41macro_rules! compile_register {
42 ($reg:expr, $ctx:ident) => {
43 {
44 let addr = $reg.addr();
45 let reg = $ctx.alloc_register_for_ptr(addr);
46 let const_id = $reg.compile_const($ctx).unwrap();
47 $ctx.emit_const_load(reg, const_id);
48 reg
49 }
50 };
51}
52
53#[macro_export]
54macro_rules! compile_register_mat {
55 ($reg:expr, $ctx:ident) => {
56 {
57 let addr = $reg.addr();
58 let reg = $ctx.alloc_register_for_ptr(addr);
59 let const_id = $reg.compile_const_mat($ctx).unwrap();
60 $ctx.emit_const_load(reg, const_id);
61 reg
62 }
63 };
64}
65
66#[macro_export]
67macro_rules! compile_nullop {
68 ($name:tt, $out:expr, $ctx:ident, $feature_flag:expr) => {
69 let mut registers = [0];
71
72 registers[0] = compile_register_brrw!($out, $ctx);
74
75 $ctx.features.insert($feature_flag);
76
77 $ctx.emit_nullop(
79 hash_str(&$name),
80 registers[0],
81 );
82
83 return Ok(registers[0]);
84 };
85}
86
87#[macro_export]
88macro_rules! compile_unop {
89 ($name:tt, $out:expr, $arg:expr, $ctx:ident, $feature_flag:expr) => {
90 let mut registers = [0,0];
92
93 registers[0] = compile_register_brrw!($out, $ctx);
95 registers[1] = compile_register_brrw!($arg, $ctx);
96
97 $ctx.features.insert($feature_flag);
98
99 $ctx.emit_unop(
101 hash_str(&$name),
102 registers[0],
103 registers[1],
104 );
105
106 return Ok(registers[0]);
107 };
108}
109
110#[macro_export]
111macro_rules! compile_binop {
112 ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $ctx:ident, $feature_flag:expr) => {
113 let mut registers = [0,0,0];
114
115 registers[0] = compile_register_brrw!($out, $ctx);
116 registers[1] = compile_register_brrw!($arg1, $ctx);
117 registers[2] = compile_register_brrw!($arg2, $ctx);
118
119 $ctx.features.insert($feature_flag);
120
121 $ctx.emit_binop(
122 hash_str(&$name),
123 registers[0],
124 registers[1],
125 registers[2],
126 );
127
128 return Ok(registers[0])
129 };
130}
131
132#[macro_export]
133macro_rules! compile_ternop {
134 ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $arg3:expr, $ctx:ident, $feature_flag:expr) => {
135 let mut registers = [0,0,0,0];
136
137 registers[0] = compile_register_brrw!($out, $ctx);
138 registers[1] = compile_register_brrw!($arg1, $ctx);
139 registers[2] = compile_register_brrw!($arg2, $ctx);
140 registers[3] = compile_register_brrw!($arg3, $ctx);
141
142 $ctx.features.insert($feature_flag);
143
144 $ctx.emit_ternop(
145 hash_str(&$name),
146 registers[0],
147 registers[1],
148 registers[2],
149 registers[3],
150 );
151
152 return Ok(registers[0])
153 };
154}
155
156#[macro_export]
157macro_rules! compile_quadop {
158 ($name:tt, $out:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $ctx:ident, $feature_flag:expr) => {
159 let mut registers = [0,0,0,0,0];
160
161 registers[0] = compile_register_brrw!($out, $ctx);
162 registers[1] = compile_register_brrw!($arg1, $ctx);
163 registers[2] = compile_register_brrw!($arg2, $ctx);
164 registers[3] = compile_register_brrw!($arg3, $ctx);
165 registers[4] = compile_register_brrw!($arg4, $ctx);
166
167 $ctx.features.insert($feature_flag);
168
169 $ctx.emit_quadop(
170 hash_str(&$name),
171 registers[0],
172 registers[1],
173 registers[2],
174 registers[3],
175 registers[4],
176 );
177 return Ok(registers[0])
178 };
179}
180
181#[macro_export]
182macro_rules! compile_varop {
183 ($name:tt, $out:expr, $args:expr, $ctx:ident, $feature_flag:expr) => {
184 let arg_count = $args.len();
185 let mut registers = vec![0; arg_count + 1];
186 registers[0] = compile_register_brrw!($out, $ctx);
187 for i in 0..arg_count {
188 registers[i + 1] = compile_register_brrw!($args[i], $ctx);
189 }
190 $ctx.features.insert($feature_flag);
191 $ctx.emit_varop(
192 hash_str(&$name),
193 registers[0],
194 (®isters[1..]).to_vec(),
195 );
196 return Ok(registers[0])
197 };
198}
199
200#[macro_export]
201macro_rules! register_fxn_descriptor_inner_logic {
202 ($struct_name:ident, $type:ty, $type_string:tt) => {
204 paste!{
205 #[cfg(not(target_arch = "wasm32"))]
206 #[cfg(feature = $type_string)]
207 inventory::submit! {
208 FunctionDescriptor {
209 name: concat!(stringify!($struct_name), "<", stringify!([<$type:lower>]), ">"),
210 ptr: $struct_name::new,
211 }
212 }
213 }
214 };
215}
216
217#[macro_export]
218macro_rules! register_fxn_descriptor_inner {
219 ($struct_name:ident, $type:ty, $type_string:tt) => {
221 paste!{
222 #[cfg(not(target_arch = "wasm32"))]
223 #[cfg(feature = $type_string)]
224 inventory::submit! {
225 FunctionDescriptor {
226 name: concat!(stringify!($struct_name), "<", stringify!([<$type:lower>]), ">"),
227 ptr: $struct_name::<$type>::new,
228 }
229 }
230 }
231 };
232}
233
234#[macro_export]
235macro_rules! register_fxn_descriptor {
236 ($struct_name:ident, $($type:ty, $type_string:tt),+ $(,)?) => {
237 $( register_fxn_descriptor_inner!($struct_name, $type, $type_string); )+
238 };
239}
240
241#[macro_export]
242macro_rules! impl_binop {
243 ($struct_name:ident, $arg1_type:ty, $arg2_type:ty, $out_type:ty, $op:ident, $feature_flag:expr) => {
244 #[derive(Debug)]
245 pub struct $struct_name<T> {
246 pub lhs: Ref<$arg1_type>,
247 pub rhs: Ref<$arg2_type>,
248 pub out: Ref<$out_type>,
249 }
250 impl<T> MechFunctionFactory for $struct_name<T>
251 where
252 #[cfg(feature = "compiler")]T: Copy + Debug + Display + Clone + Sync + Send + 'static + PartialEq + PartialOrd + ConstElem + CompileConst + AsValueKind +Add<Output = T> + AddAssign +Sub<Output = T> + SubAssign +Mul<Output = T> + MulAssign +Div<Output = T> + DivAssign +Zero + One,
253 #[cfg(not(feature = "compiler"))] T: Copy + Debug + Display + Clone + Sync + Send + 'static + PartialEq + PartialOrd + AsValueKind +Add<Output = T> + AddAssign +Sub<Output = T> + SubAssign +Mul<Output = T> + MulAssign +Div<Output = T> + DivAssign +Zero + One,
254 Ref<$out_type>: ToValue,
255 {
256 fn new(args: FunctionArgs) -> MResult<Box<dyn MechFunction>> {
257 match args {
258 FunctionArgs::Binary(out, arg1, arg2) => {
259 let lhs: Ref<$arg1_type> = unsafe { arg1.as_unchecked() }.clone();
260 let rhs: Ref<$arg2_type> = unsafe { arg2.as_unchecked() }.clone();
261 let out: Ref<$out_type> = unsafe { out.as_unchecked() }.clone();
262 Ok(Box::new(Self {lhs, rhs, out }))
263 },
264 _ => Err(MechError::new(
265 IncorrectNumberOfArguments { expected: 2, found: args.len() },
266 None
267 ).with_compiler_loc()
268 ),
269 }
270 }
271 }
272 impl<T> MechFunctionImpl for $struct_name<T>
273 where
274 T: Copy + Debug + Display + Clone + Sync + Send + 'static +
275 PartialEq + PartialOrd +
276 Add<Output = T> + AddAssign +
277 Sub<Output = T> + SubAssign +
278 Mul<Output = T> + MulAssign +
279 Div<Output = T> + DivAssign +
280 Zero + One,
281 Ref<$out_type>: ToValue
282 {
283 fn solve(&self) {
284 let lhs_ptr = self.lhs.as_ptr();
285 let rhs_ptr = self.rhs.as_ptr();
286 let out_ptr = self.out.as_mut_ptr();
287 $op!(lhs_ptr,rhs_ptr,out_ptr);
288 }
289 fn out(&self) -> Value { self.out.to_value() }
290 fn to_string(&self) -> String { format!("{:#?}", self) }
291 }
292 #[cfg(feature = "compiler")]
293 impl<T> MechFunctionCompiler for $struct_name<T>
294 where
295 T: ConstElem + CompileConst + AsValueKind
296 {
297 fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
298 let name = format!("{}<{}>", stringify!($struct_name), T::as_value_kind());
299 compile_binop!(name, self.out, self.lhs, self.rhs, ctx, $feature_flag);
300 }
301 }
302 };
303}
304
305#[macro_export]
306macro_rules! impl_unop {
307 ($struct_name:ident, $arg_type:ty, $out_type:ty, $op:ident, $feature_flag:expr) => {
308 #[derive(Debug)]
309 struct $struct_name {
310 arg: Ref<$arg_type>,
311 out: Ref<$out_type>,
312 }
313 impl MechFunctionFactory for $struct_name {
314 fn new(args: FunctionArgs) -> MResult<Box<dyn MechFunction>> {
315 match args {
316 FunctionArgs::Unary(out, arg) => {
317 let arg: Ref<$arg_type> = unsafe { arg.as_unchecked() }.clone();
318 let out: Ref<$out_type> = unsafe { out.as_unchecked() }.clone();
319 Ok(Box::new(Self {arg, out }))
320 },
321 _ => Err(MechError::new(
322 IncorrectNumberOfArguments { expected: 1, found: args.len() },
323 None
324 ).with_compiler_loc()
325 ),
326 }
327 }
328 }
329 impl MechFunctionImpl for $struct_name {
330 fn solve(&self) {
331 let arg_ptr = self.arg.as_ptr();
332 let out_ptr = self.out.as_mut_ptr();
333 $op!(arg_ptr,out_ptr);
334 }
335 fn out(&self) -> Value { self.out.to_value() }
336 fn to_string(&self) -> String { format!("{:#?}", self) }
337 }
338 #[cfg(feature = "compiler")]
339 impl MechFunctionCompiler for $struct_name {
340 fn compile(&self, ctx: &mut CompileCtx) -> MResult<Register> {
341 let name = format!("{}", stringify!($struct_name));
342 compile_unop!(name, self.out, self.arg, ctx, $feature_flag);
343 }
344 }
345 #[cfg(not(target_arch = "wasm32"))]
346 inventory::submit! {
347 FunctionDescriptor {
348 name: stringify!($struct_name),
349 ptr: $struct_name::new,
350 }
351 }
352 };}
353
354#[macro_export]
355macro_rules! impl_fxns {
356 ($lib:ident, $in:ident, $out:ident, $op:ident) => {
357 paste!{
358 $op!([<$lib SS>], $in, $in, $out, [<$lib:lower _op>], FeatureFlag::Builtin(FeatureKind::$lib));
360 #[cfg(feature = "matrix1")]
362 $op!([<$lib SM1>], $in, Matrix1<$in>, Matrix1<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
363 #[cfg(feature = "matrix2")]
364 $op!([<$lib SM2>], $in, Matrix2<$in>, Matrix2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
365 #[cfg(feature = "matrix3")]
366 $op!([<$lib SM3>], $in, Matrix3<$in>, Matrix3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
367
368 #[cfg(feature = "matrix4")]
369 $op!([<$lib SM4>], $in, Matrix4<$in>, Matrix4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
370 #[cfg(feature = "matrix2x3")]
371 $op!([<$lib SM2x3>], $in, Matrix2x3<$in>, Matrix2x3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
372 #[cfg(feature = "matrix3x2")]
373 $op!([<$lib SM3x2>], $in, Matrix3x2<$in>, Matrix3x2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
374 #[cfg(feature = "matrixd")]
375 $op!([<$lib SMD>], $in, DMatrix<$in>, DMatrix<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
376 #[cfg(feature = "row_vector2")]
378 $op!([<$lib SR2>], $in, RowVector2<$in>, RowVector2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
379 #[cfg(feature = "row_vector3")]
380 $op!([<$lib SR3>], $in, RowVector3<$in>, RowVector3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
381 #[cfg(feature = "row_vector4")]
382 $op!([<$lib SR4>], $in, RowVector4<$in>, RowVector4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
383 #[cfg(feature = "row_vectord")]
384 $op!([<$lib SRD>], $in, RowDVector<$in>, RowDVector<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
385 #[cfg(feature = "vector2")]
387 $op!([<$lib SV2>], $in, Vector2<$in>, Vector2<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
388 #[cfg(feature = "vector3")]
389 $op!([<$lib SV3>], $in, Vector3<$in>, Vector3<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
390 #[cfg(feature = "vector4")]
391 $op!([<$lib SV4>], $in, Vector4<$in>, Vector4<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
392 #[cfg(feature = "vectord")]
393 $op!([<$lib SVD>], $in, DVector<$in>, DVector<$out>,[<$lib:lower _scalar_rhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
394 #[cfg(feature = "matrix1")]
396 $op!([<$lib M1S>], Matrix1<$in>, $in, Matrix1<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
397 #[cfg(feature = "matrix2")]
398 $op!([<$lib M2S>], Matrix2<$in>, $in, Matrix2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
399 #[cfg(feature = "matrix3")]
400 $op!([<$lib M3S>], Matrix3<$in>, $in, Matrix3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
401 #[cfg(feature = "matrix4")]
402 $op!([<$lib M4S>], Matrix4<$in>, $in, Matrix4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
403 #[cfg(feature = "matrix2x3")]
404 $op!([<$lib M2x3S>], Matrix2x3<$in>, $in, Matrix2x3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
405 #[cfg(feature = "matrix3x2")]
406 $op!([<$lib M3x2S>], Matrix3x2<$in>, $in, Matrix3x2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
407 #[cfg(feature = "matrixd")]
408 $op!([<$lib MDS>], DMatrix<$in>, $in, DMatrix<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
409 #[cfg(feature = "row_vector2")]
411 $op!([<$lib R2S>], RowVector2<$in>, $in, RowVector2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
412 #[cfg(feature = "row_vector3")]
413 $op!([<$lib R3S>], RowVector3<$in>, $in, RowVector3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
414 #[cfg(feature = "row_vector4")]
415 $op!([<$lib R4S>], RowVector4<$in>, $in, RowVector4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
416 #[cfg(feature = "row_vectord")]
417 $op!([<$lib RDS>], RowDVector<$in>, $in, RowDVector<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
418 #[cfg(feature = "vector2")]
420 $op!([<$lib V2S>], Vector2<$in>, $in, Vector2<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
421 #[cfg(feature = "vector3")]
422 $op!([<$lib V3S>], Vector3<$in>, $in, Vector3<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
423 #[cfg(feature = "vector4")]
424 $op!([<$lib V4S>], Vector4<$in>, $in, Vector4<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
425 #[cfg(feature = "vectord")]
426 $op!([<$lib VDS>], DVector<$in>, $in, DVector<$out>,[<$lib:lower _scalar_lhs_op>], FeatureFlag::Builtin(FeatureKind::$lib));
427 #[cfg(feature = "matrix1")]
429 $op!([<$lib M1M1>], Matrix1<$in>, Matrix1<$in>, Matrix1<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
430 #[cfg(feature = "matrix2")]
431 $op!([<$lib M2M2>], Matrix2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
432 #[cfg(feature = "matrix3")]
433 $op!([<$lib M3M3>], Matrix3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
434 #[cfg(feature = "matrix4")]
435 $op!([<$lib M4M4>], Matrix4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
436 #[cfg(feature = "matrix2x3")]
437 $op!([<$lib M2x3M2x3>], Matrix2x3<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
438 #[cfg(feature = "matrix3x2")]
439 $op!([<$lib M3x2M3x2>], Matrix3x2<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
440 #[cfg(feature = "matrixd")]
441 $op!([<$lib MDMD>], DMatrix<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
442 #[cfg(all(feature = "matrix2", feature = "vector2"))]
444 $op!([<$lib M2V2>], Matrix2<$in>, Vector2<$in>, Matrix2<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
445 #[cfg(all(feature = "matrix3", feature = "vector3"))]
446 $op!([<$lib M3V3>], Matrix3<$in>, Vector3<$in>, Matrix3<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
447 #[cfg(all(feature = "matrix4", feature = "vector4"))]
448 $op!([<$lib M4V4>], Matrix4<$in>, Vector4<$in>, Matrix4<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
449 #[cfg(all(feature = "matrix2x3", feature = "vector2"))]
450 $op!([<$lib M2x3V2>], Matrix2x3<$in>, Vector2<$in>, Matrix2x3<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
451 #[cfg(all(feature = "matrix3x2", feature = "vector3"))]
452 $op!([<$lib M3x2V3>], Matrix3x2<$in>, Vector3<$in>, Matrix3x2<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
453 #[cfg(all(feature = "matrixd", feature = "vectord"))]
454 $op!([<$lib MDVD>], DMatrix<$in>, DVector<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
455 #[cfg(all(feature = "matrixd", feature = "vector2"))]
456 $op!([<$lib MDV2>], DMatrix<$in>, Vector2<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
457 #[cfg(all(feature = "matrixd", feature = "vector3"))]
458 $op!([<$lib MDV3>], DMatrix<$in>, Vector3<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
459 #[cfg(all(feature = "matrixd", feature = "vector4"))]
460 $op!([<$lib MDV4>], DMatrix<$in>, Vector4<$in>, DMatrix<$out>, [<$lib:lower _mat_vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
461 #[cfg(all(feature = "vector2", feature = "matrix2"))]
463 $op!([<$lib V2M2>], Vector2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
464 #[cfg(all(feature = "vector3", feature = "matrix3"))]
465 $op!([<$lib V3M3>], Vector3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
466 #[cfg(all(feature = "vector4", feature = "matrix4"))]
467 $op!([<$lib V4M4>], Vector4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
468 #[cfg(all(feature = "vector2", feature = "matrix2x3"))]
469 $op!([<$lib V2M2x3>], Vector2<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
470 #[cfg(all(feature = "vector3", feature = "matrix3x2"))]
471 $op!([<$lib V3M3x2>], Vector3<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
472 #[cfg(all(feature = "vectord", feature = "matrixd"))]
473 $op!([<$lib VDMD>], DVector<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
474 #[cfg(all(feature = "vector2", feature = "matrixd"))]
475 $op!([<$lib V2MD>], Vector2<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
476 #[cfg(all(feature = "vector3", feature = "matrixd"))]
477 $op!([<$lib V3MD>], Vector3<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
478 #[cfg(all(feature = "vector4", feature = "matrixd"))]
479 $op!([<$lib V4MD>], Vector4<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _vec_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
480 #[cfg(all(feature = "matrix2", feature = "row_vector2"))]
482 $op!([<$lib M2R2>], Matrix2<$in>, RowVector2<$in>, Matrix2<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
483 #[cfg(all(feature = "matrix3", feature = "row_vector3"))]
484 $op!([<$lib M3R3>], Matrix3<$in>, RowVector3<$in>, Matrix3<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
485 #[cfg(all(feature = "matrix4", feature = "row_vector4"))]
486 $op!([<$lib M4R4>], Matrix4<$in>, RowVector4<$in>, Matrix4<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
487 #[cfg(all(feature = "matrix2x3", feature = "row_vector3"))]
488 $op!([<$lib M2x3R3>], Matrix2x3<$in>, RowVector3<$in>, Matrix2x3<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
489 #[cfg(all(feature = "matrix3x2", feature = "row_vector2"))]
490 $op!([<$lib M3x2R2>], Matrix3x2<$in>, RowVector2<$in>, Matrix3x2<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
491 #[cfg(all(feature = "matrixd", feature = "row_vectord"))]
492 $op!([<$lib MDRD>], DMatrix<$in>, RowDVector<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
493 #[cfg(all(feature = "matrixd", feature = "row_vector2"))]
494 $op!([<$lib MDR2>], DMatrix<$in>, RowVector2<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
495 #[cfg(all(feature = "matrixd", feature = "row_vector3"))]
496 $op!([<$lib MDR3>], DMatrix<$in>, RowVector3<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
497 #[cfg(all(feature = "matrixd", feature = "row_vector4"))]
498 $op!([<$lib MDR4>], DMatrix<$in>, RowVector4<$in>, DMatrix<$out>, [<$lib:lower _mat_row_op>], FeatureFlag::Builtin(FeatureKind::$lib));
499 #[cfg(all(feature = "row_vector2", feature = "matrix2"))]
501 $op!([<$lib R2M2>], RowVector2<$in>, Matrix2<$in>, Matrix2<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
502 #[cfg(all(feature = "row_vector3", feature = "matrix3"))]
503 $op!([<$lib R3M3>], RowVector3<$in>, Matrix3<$in>, Matrix3<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
504 #[cfg(all(feature = "row_vector4", feature = "matrix4"))]
505 $op!([<$lib R4M4>], RowVector4<$in>, Matrix4<$in>, Matrix4<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
506 #[cfg(all(feature = "row_vector3", feature = "matrix2x3"))]
507 $op!([<$lib R3M2x3>], RowVector3<$in>, Matrix2x3<$in>, Matrix2x3<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
508 #[cfg(all(feature = "row_vector2", feature = "matrix3x2"))]
509 $op!([<$lib R2M3x2>], RowVector2<$in>, Matrix3x2<$in>, Matrix3x2<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
510 #[cfg(all(feature = "row_vectord", feature = "matrixd"))]
511 $op!([<$lib RDMD>], RowDVector<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
512 #[cfg(all(feature = "row_vector2", feature = "matrixd"))]
513 $op!([<$lib R2MD>], RowVector2<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
514 #[cfg(all(feature = "row_vector3", feature = "matrixd"))]
515 $op!([<$lib R3MD>], RowVector3<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
516 #[cfg(all(feature = "row_vector4", feature = "matrixd"))]
517 $op!([<$lib R4MD>], RowVector4<$in>, DMatrix<$in>, DMatrix<$out>, [<$lib:lower _row_mat_op>], FeatureFlag::Builtin(FeatureKind::$lib));
518 #[cfg(feature = "row_vector2")]
520 $op!([<$lib R2R2>], RowVector2<$in>, RowVector2<$in>, RowVector2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
521 #[cfg(feature = "row_vector3")]
522 $op!([<$lib R3R3>], RowVector3<$in>, RowVector3<$in>, RowVector3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
523 #[cfg(feature = "row_vector4")]
524 $op!([<$lib R4R4>], RowVector4<$in>, RowVector4<$in>, RowVector4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
525 #[cfg(feature = "row_vectord")]
526 $op!([<$lib RDRD>], RowDVector<$in>, RowDVector<$in>, RowDVector<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
527 #[cfg(feature = "vector2")]
529 $op!([<$lib V2V2>], Vector2<$in>, Vector2<$in>, Vector2<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
530 #[cfg(feature = "vector3")]
531 $op!([<$lib V3V3>], Vector3<$in>, Vector3<$in>, Vector3<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
532 #[cfg(feature = "vector4")]
533 $op!([<$lib V4V4>], Vector4<$in>, Vector4<$in>, Vector4<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
534 #[cfg(feature = "vectord")]
535 $op!([<$lib VDVD>], DVector<$in>, DVector<$in>, DVector<$out>, [<$lib:lower _vec_op>], FeatureFlag::Builtin(FeatureKind::$lib));
536 }
537 }}
538
539#[macro_export]
540macro_rules! impl_binop_match_arms {
541 ($lib:ident, $registrar:tt, $arg:expr, $($lhs_type:ident, $($target_type:ident, $value_string:tt),+);+ $(;)?) => {
542 paste!{
543 match $arg {
544 $(
545 $(
546 #[cfg(all(feature = $value_string))]
548 (Value::$lhs_type(lhs), Value::$lhs_type(rhs)) => {
549 $registrar!([<$lib SS>], $target_type, $value_string);
550 Ok(Box::new([<$lib SS>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new($target_type::default()) }))
551 },
552 #[cfg(all(feature = $value_string, feature = "matrix1"))]
554 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix1(rhs))) => {
555 $registrar!([<$lib SM1>], $target_type, $value_string);
556 Ok(Box::new([<$lib SM1>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
557 },
558 #[cfg(all(feature = $value_string, feature = "matrix2"))]
559 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
560 $registrar!([<$lib SM2>], $target_type, $value_string);
561 Ok(Box::new([<$lib SM2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
562 },
563 #[cfg(all(feature = $value_string, feature = "matrix3"))]
564 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
565 $registrar!([<$lib SM3>], $target_type, $value_string);
566 Ok(Box::new([<$lib SM3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
567 },
568 #[cfg(all(feature = $value_string, feature = "matrix4"))]
569 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
570 $registrar!([<$lib SM4>], $target_type, $value_string);
571 Ok(Box::new([<$lib SM4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
572 },
573 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
574 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
575 $registrar!([<$lib SM2x3>], $target_type, $value_string);
576 Ok(Box::new([<$lib SM2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
577 },
578 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
579 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
580 $registrar!([<$lib SM3x2>], $target_type, $value_string);
581 Ok(Box::new([<$lib SM3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
582 },
583 #[cfg(all(feature = $value_string, feature = "matrixd"))]
584 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
585 let (rows,cols) = {rhs.borrow().shape()};
586 $registrar!([<$lib SMD>], $target_type, $value_string);
587 Ok(Box::new([<$lib SMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
588 },
589 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
591 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
592 $registrar!([<$lib SR2>], $target_type, $value_string);
593 Ok(Box::new([<$lib SR2>]{lhs, rhs, out: Ref::new(RowVector2::from_element($target_type::default()))}))
594 },
595 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
596 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
597 $registrar!([<$lib SR3>], $target_type, $value_string);
598 Ok(Box::new([<$lib SR3>]{lhs, rhs, out: Ref::new(RowVector3::from_element($target_type::default()))}))
599 },
600 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
601 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
602 $registrar!([<$lib SR4>], $target_type, $value_string);
603 Ok(Box::new([<$lib SR4>]{lhs, rhs, out: Ref::new(RowVector4::from_element($target_type::default()))}))
604 },
605 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
606 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::RowDVector(rhs))) => {
607 $registrar!([<$lib SRD>], $target_type, $value_string);
608 Ok(Box::new([<$lib SRD>]{lhs, rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().len(),$target_type::default()))}))
609 },
610 #[cfg(all(feature = $value_string, feature = "vector2"))]
612 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
613 $registrar!([<$lib SV2>], $target_type, $value_string);
614 Ok(Box::new([<$lib SV2>]{lhs, rhs, out: Ref::new(Vector2::from_element($target_type::default()))}))
615 },
616 #[cfg(all(feature = $value_string, feature = "vector3"))]
617 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
618 $registrar!([<$lib SV3>], $target_type, $value_string);
619 Ok(Box::new([<$lib SV3>]{lhs, rhs, out: Ref::new(Vector3::from_element($target_type::default()))}))
620 },
621 #[cfg(all(feature = $value_string, feature = "vector4"))]
622 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
623 $registrar!([<$lib SV4>], $target_type, $value_string);
624 Ok(Box::new([<$lib SV4>]{lhs, rhs, out: Ref::new(Vector4::from_element($target_type::default()))}))
625 },
626 #[cfg(all(feature = $value_string, feature = "vectord"))]
627 (Value::$lhs_type(lhs), Value::[<Matrix $lhs_type>](Matrix::DVector(rhs))) => {
628 $registrar!([<$lib SVD>], $target_type, $value_string);
629 Ok(Box::new([<$lib SVD>]{lhs, rhs: rhs.clone(), out: Ref::new(DVector::from_element(rhs.borrow().len(),$target_type::default()))}))
630 },
631 #[cfg(all(feature = $value_string, feature = "matrix1"))]
633 (Value::[<Matrix $lhs_type>](Matrix::Matrix1(lhs)),Value::$lhs_type(rhs)) => {
634 $registrar!([<$lib M1S>], $target_type, $value_string);
635 Ok(Box::new([<$lib M1S>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
636 },
637 #[cfg(all(feature = $value_string, feature = "matrix2"))]
638 (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::$lhs_type(rhs)) => {
639 $registrar!([<$lib M2S>], $target_type, $value_string);
640 Ok(Box::new([<$lib M2S>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
641 },
642 #[cfg(all(feature = $value_string, feature = "matrix3"))]
643 (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::$lhs_type(rhs)) => {
644 $registrar!([<$lib M3S>], $target_type, $value_string);
645 Ok(Box::new([<$lib M3S>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
646 },
647 #[cfg(all(feature = $value_string, feature = "matrix4"))]
648 (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::$lhs_type(rhs)) => {
649 $registrar!([<$lib M4S>], $target_type, $value_string);
650 Ok(Box::new([<$lib M4S>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
651 },
652 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
653 (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::$lhs_type(rhs)) => {
654 $registrar!([<$lib M2x3S>], $target_type, $value_string);
655 Ok(Box::new([<$lib M2x3S>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
656 },
657 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
658 (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::$lhs_type(rhs)) => {
659 $registrar!([<$lib M3x2S>], $target_type, $value_string);
660 Ok(Box::new([<$lib M3x2S>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
661 },
662 #[cfg(all(feature = $value_string, feature = "matrixd"))]
663 (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)),Value::$lhs_type(rhs)) => {
664 let (rows,cols) = {lhs.borrow().shape()};
665 $registrar!([<$lib MDS>], $target_type, $value_string);
666 Ok(Box::new([<$lib MDS>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
667 },
668 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
670 (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)),Value::$lhs_type(rhs)) => {
671 $registrar!([<$lib R2S>], $target_type, $value_string);
672 Ok(Box::new([<$lib R2S>]{lhs, rhs, out: Ref::new(RowVector2::from_element($target_type::default()))}))
673 },
674 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
675 (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)),Value::$lhs_type(rhs)) => {
676 $registrar!([<$lib R3S>], $target_type, $value_string);
677 Ok(Box::new([<$lib R3S>]{lhs, rhs, out: Ref::new(RowVector3::from_element($target_type::default()))}))
678 },
679 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
680 (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)),Value::$lhs_type(rhs)) => {
681 $registrar!([<$lib R4S>], $target_type, $value_string);
682 Ok(Box::new([<$lib R4S>]{lhs, rhs, out: Ref::new(RowVector4::from_element($target_type::default()))}))
683 },
684 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
685 (Value::[<Matrix $lhs_type>](Matrix::RowDVector(lhs)),Value::$lhs_type(rhs)) => {
686 $registrar!([<$lib RDS>], $target_type, $value_string);
687 Ok(Box::new([<$lib RDS>]{lhs: lhs.clone(), rhs, out: Ref::new(RowDVector::from_element(lhs.borrow().len(),$target_type::default()))}))
688 },
689 #[cfg(all(feature = $value_string, feature = "vector2"))]
691 (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)),Value::$lhs_type(rhs)) => {
692 $registrar!([<$lib V2S>], $target_type, $value_string);
693 Ok(Box::new([<$lib V2S>]{lhs, rhs, out: Ref::new(Vector2::from_element($target_type::default()))}))
694 },
695 #[cfg(all(feature = $value_string, feature = "vector3"))]
696 (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)),Value::$lhs_type(rhs)) => {
697 $registrar!([<$lib V3S>], $target_type, $value_string);
698 Ok(Box::new([<$lib V3S>]{lhs, rhs, out: Ref::new(Vector3::from_element($target_type::default()))}))
699 },
700 #[cfg(all(feature = $value_string, feature = "vector4"))]
701 (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)),Value::$lhs_type(rhs)) => {
702 $registrar!([<$lib V4S>], $target_type, $value_string);
703 Ok(Box::new([<$lib V4S>]{lhs, rhs, out: Ref::new(Vector4::from_element($target_type::default()))}))
704 },
705 #[cfg(all(feature = $value_string, feature = "vectord"))]
706 (Value::[<Matrix $lhs_type>](Matrix::DVector(lhs)),Value::$lhs_type(rhs)) => {
707 $registrar!([<$lib VDS>], $target_type, $value_string);
708 Ok(Box::new([<$lib VDS>]{lhs: lhs.clone(), rhs, out: Ref::new(DVector::from_element(lhs.borrow().len(),$target_type::default()))}))
709 },
710 #[cfg(all(feature = $value_string, feature = "matrix1"))]
712 (Value::[<Matrix $lhs_type>](Matrix::Matrix1(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix1(rhs))) => {
713 $registrar!([<$lib M1M1>], $target_type, $value_string);
714 Ok(Box::new([<$lib M1M1>]{lhs, rhs, out: Ref::new(Matrix1::from_element($target_type::default()))}))
715 },
716 #[cfg(all(feature = $value_string, feature = "matrix2"))]
717 (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
718 $registrar!([<$lib M2M2>], $target_type, $value_string);
719 Ok(Box::new([<$lib M2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
720 },
721 #[cfg(all(feature = $value_string, feature = "matrix3"))]
722 (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
723 $registrar!([<$lib M3M3>], $target_type, $value_string);
724 Ok(Box::new([<$lib M3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
725 },
726 #[cfg(all(feature = $value_string, feature = "matrix4"))]
727 (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
728 $registrar!([<$lib M4M4>], $target_type, $value_string);
729 Ok(Box::new([<$lib M4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
730 },
731 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
732 (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
733 $registrar!([<$lib M2x3M2x3>], $target_type, $value_string);
734 Ok(Box::new([<$lib M2x3M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
735 },
736 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
737 (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
738 $registrar!([<$lib M3x2M3x2>], $target_type, $value_string);
739 Ok(Box::new([<$lib M3x2M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
740 },
741 #[cfg(all(feature = $value_string, feature = "matrixd"))]
742 (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)), Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
743 let (rows,cols) = {lhs.borrow().shape()};
744 Ok(Box::new([<$lib MDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
745 },
746 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
748 (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
749 $registrar!([<$lib R2R2>], $target_type, $value_string);
750 Ok(Box::new([<$lib R2R2>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector2::from_element($target_type::default())) }))
751 },
752 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
753 (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
754 $registrar!([<$lib R3R3>], $target_type, $value_string);
755 Ok(Box::new([<$lib R3R3>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector3::from_element($target_type::default())) }))
756 },
757 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
758 (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
759 $registrar!([<$lib R4R4>], $target_type, $value_string);
760 Ok(Box::new([<$lib R4R4>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector4::from_element($target_type::default())) }))
761 },
762 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
763 (Value::[<Matrix $lhs_type>](Matrix::RowDVector(lhs)), Value::[<Matrix $lhs_type>](Matrix::RowDVector(rhs))) => {
764 $registrar!([<$lib RDRD>], $target_type, $value_string);
765 Ok(Box::new([<$lib RDRD>]{lhs: lhs.clone(), rhs, out: Ref::new(RowDVector::from_element(lhs.borrow().len(),$target_type::default())) }))
766 },
767 #[cfg(all(feature = $value_string, feature = "vector2"))]
769 (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
770 $registrar!([<$lib V2V2>], $target_type, $value_string);
771 Ok(Box::new([<$lib V2V2>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector2::from_element($target_type::default())) }))
772 },
773 #[cfg(all(feature = $value_string, feature = "vector3"))]
774 (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
775 $registrar!([<$lib V3V3>], $target_type, $value_string);
776 Ok(Box::new([<$lib V3V3>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector3::from_element($target_type::default())) }))
777 },
778 #[cfg(all(feature = $value_string, feature = "vector4"))]
779 (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
780 $registrar!([<$lib V4V4>], $target_type, $value_string);
781 Ok(Box::new([<$lib V4V4>]{lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector4::from_element($target_type::default())) }))
782 },
783 #[cfg(all(feature = $value_string, feature = "vectord"))]
784 (Value::[<Matrix $lhs_type>](Matrix::DVector(lhs)), Value::[<Matrix $lhs_type>](Matrix::DVector(rhs))) => {
785 $registrar!([<$lib VDVD>], $target_type, $value_string);
786 Ok(Box::new([<$lib VDVD>]{lhs: lhs.clone(), rhs, out: Ref::new(DVector::from_element(lhs.borrow().len(),$target_type::default())) }))
787 },
788 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
790 (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
791 $registrar!([<$lib M2V2>], $target_type, $value_string);
792 Ok(Box::new([<$lib M2V2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
793 },
794 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
795 (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
796 $registrar!([<$lib M3V3>], $target_type, $value_string);
797 Ok(Box::new([<$lib M3V3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
798 },
799 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector2"))]
800 (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector2(rhs))) => {
801 $registrar!([<$lib M2x3V2>], $target_type, $value_string);
802 Ok(Box::new([<$lib M2x3V2>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
803 },
804 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector3"))]
805 (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector3(rhs))) => {
806 $registrar!([<$lib M3x2V3>], $target_type, $value_string);
807 Ok(Box::new([<$lib M3x2V3>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
808 },
809 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
810 (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::[<Matrix $lhs_type>](Matrix::Vector4(rhs))) => {
811 $registrar!([<$lib M4V4>], $target_type, $value_string);
812 Ok(Box::new([<$lib M4V4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
813 },
814 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "row_vector2"))]
816 (Value::[<Matrix $lhs_type>](Matrix::Matrix2(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
817 $registrar!([<$lib M2R2>], $target_type, $value_string);
818 Ok(Box::new([<$lib M2R2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
819 },
820 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "row_vector3"))]
821 (Value::[<Matrix $lhs_type>](Matrix::Matrix3(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
822 $registrar!([<$lib M3R3>], $target_type, $value_string);
823 Ok(Box::new([<$lib M3R3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
824 },
825 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "row_vector3"))]
826 (Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector3(rhs))) => {
827 $registrar!([<$lib M2x3R3>], $target_type, $value_string);
828 Ok(Box::new([<$lib M2x3R3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
829 },
830 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "row_vector2"))]
831 (Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector2(rhs))) => {
832 $registrar!([<$lib M3x2R2>], $target_type, $value_string);
833 Ok(Box::new([<$lib M3x2R2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
834 },
835 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "row_vector4"))]
836 (Value::[<Matrix $lhs_type>](Matrix::Matrix4(lhs)),Value::[<Matrix $lhs_type>](Matrix::RowVector4(rhs))) => {
837 $registrar!([<$lib M4R4>], $target_type, $value_string);
838 Ok(Box::new([<$lib M4R4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
839 },
840 #[cfg(all(feature = $value_string, feature = "matrixd"))]
841 (Value::[<Matrix $lhs_type>](Matrix::DMatrix(lhs)),Value::[<Matrix $lhs_type>](rhs)) => {
842 let (rows,cols) = {lhs.borrow().shape()};
843 let rhs_shape = rhs.shape();
844 match (rows,cols,rhs_shape[0],rhs_shape[1]) {
845 (n,_,m,1) if n == m => (),
847 (_,n,1,m) if n == m => (),
849 _ => {
851 return Err(
852 MechError::new(
853 DimensionMismatch { dims: vec![rows, cols, rhs_shape[0], rhs_shape[1]] },
854 None
855 ).with_compiler_loc()
856 );
857 }
858 }
859 match rhs {
860 #[cfg(feature = "vector2")]
861 Matrix::Vector2(rhs) => {
862 $registrar!([<$lib MDV2>], $target_type, $value_string);
863 Ok(Box::new([<$lib MDV2>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
864 },
865 #[cfg(feature = "vector3")]
866 Matrix::Vector3(rhs) => {
867 $registrar!([<$lib MDV3>], $target_type, $value_string);
868 Ok(Box::new([<$lib MDV3>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
869 },
870 #[cfg(feature = "vector4")]
871 Matrix::Vector4(rhs) => {
872 $registrar!([<$lib MDV4>], $target_type, $value_string);
873 Ok(Box::new([<$lib MDV4>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
874 },
875 #[cfg(feature = "vectord")]
876 Matrix::DVector(rhs) => {
877 $registrar!([<$lib MDVD>], $target_type, $value_string);
878 Ok(Box::new([<$lib MDVD>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
879 },
880 #[cfg(feature = "row_vector2")]
881 Matrix::RowVector2(rhs) => {
882 $registrar!([<$lib MDR2>], $target_type, $value_string);
883 Ok(Box::new([<$lib MDR2>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
884 },
885 #[cfg(feature = "row_vector3")]
886 Matrix::RowVector3(rhs) => {
887 $registrar!([<$lib MDR3>], $target_type, $value_string);
888 Ok(Box::new([<$lib MDR3>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
889 },
890 #[cfg(feature = "row_vector4")]
891 Matrix::RowVector4(rhs) => {
892 $registrar!([<$lib MDR4>], $target_type, $value_string);
893 Ok(Box::new([<$lib MDR4>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
894 },
895 #[cfg(feature = "row_vectord")]
896 Matrix::RowDVector(rhs) => {
897 $registrar!([<$lib MDRD>], $target_type, $value_string);
898 Ok(Box::new([<$lib MDRD>]{lhs: lhs.clone(), rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
899 },
900 x => {
901 return Err(
902 MechError::new(
903 DimensionMismatch { dims: vec![rows, cols, rhs_shape[0], rhs_shape[1]] },
904 None
905 ).with_compiler_loc()
906 );
907 }
908 }
909 },
910 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
912 (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
913 $registrar!([<$lib V2M2>], $target_type, $value_string);
914 Ok(Box::new([<$lib V2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
915 },
916 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
917 (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
918 $registrar!([<$lib V3M3>], $target_type, $value_string);
919 Ok(Box::new([<$lib V3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
920 },
921 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector2"))]
922 (Value::[<Matrix $lhs_type>](Matrix::Vector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
923 $registrar!([<$lib V2M2x3>], $target_type, $value_string);
924 Ok(Box::new([<$lib V2M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
925 },
926 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector3"))]
927 (Value::[<Matrix $lhs_type>](Matrix::Vector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
928 $registrar!([<$lib V3M3x2>], $target_type, $value_string);
929 Ok(Box::new([<$lib V3M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
930 },
931 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
932 (Value::[<Matrix $lhs_type>](Matrix::Vector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
933 $registrar!([<$lib V4M4>], $target_type, $value_string);
934 Ok(Box::new([<$lib V4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
935 },
936 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
938 (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2(rhs))) => {
939 $registrar!([<$lib R2M2>], $target_type, $value_string);
940 Ok(Box::new([<$lib R2M2>]{lhs, rhs, out: Ref::new(Matrix2::from_element($target_type::default()))}))
941 },
942 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
943 (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3(rhs))) => {
944 $registrar!([<$lib R3M3>], $target_type, $value_string);
945 Ok(Box::new([<$lib R3M3>]{lhs, rhs, out: Ref::new(Matrix3::from_element($target_type::default()))}))
946 },
947 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix2x3"))]
948 (Value::[<Matrix $lhs_type>](Matrix::RowVector3(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix2x3(rhs))) => {
949 $registrar!([<$lib R3M2x3>], $target_type, $value_string);
950 Ok(Box::new([<$lib R3M2x3>]{lhs, rhs, out: Ref::new(Matrix2x3::from_element($target_type::default()))}))
951 },
952 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix3x2"))]
953 (Value::[<Matrix $lhs_type>](Matrix::RowVector2(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix3x2(rhs))) => {
954 $registrar!([<$lib R2M3x2>], $target_type, $value_string);
955 Ok(Box::new([<$lib R2M3x2>]{lhs, rhs, out: Ref::new(Matrix3x2::from_element($target_type::default()))}))
956 },
957 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
958 (Value::[<Matrix $lhs_type>](Matrix::RowVector4(lhs)), Value::[<Matrix $lhs_type>](Matrix::Matrix4(rhs))) => {
959 $registrar!([<$lib R4M4>], $target_type, $value_string);
960 Ok(Box::new([<$lib R4M4>]{lhs, rhs, out: Ref::new(Matrix4::from_element($target_type::default()))}))
961 },
962 #[cfg(all(feature = $value_string, feature = "matrixd"))]
963 (Value::[<Matrix $lhs_type>](lhs),Value::[<Matrix $lhs_type>](Matrix::DMatrix(rhs))) => {
964 let (rows,cols) = {rhs.borrow().shape()};
965 let lhs_shape = lhs.shape();
966 match (lhs_shape[0],lhs_shape[1],rows,cols) {
967 (m,1,n,_) if n == m => (),
969 (1,m,_,n) if n == m => (),
971 _ => {
973 return Err(
974 MechError::new(
975 DimensionMismatch { dims: vec![lhs_shape[0], lhs_shape[1], rows, cols] },
976 None
977 ).with_compiler_loc()
978 );
979 }
980 }
981 match lhs {
982 #[cfg(feature = "vector2")]
983 Matrix::Vector2(lhs) => {
984 $registrar!([<$lib V2MD>], $target_type, $value_string);
985 Ok(Box::new([<$lib V2MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
986 },
987 #[cfg(feature = "vector3")]
988 Matrix::Vector3(lhs) => {
989 $registrar!([<$lib V3MD>], $target_type, $value_string);
990 Ok(Box::new([<$lib V3MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
991 },
992 #[cfg(feature = "vector4")]
993 Matrix::Vector4(lhs) => {
994 $registrar!([<$lib V4MD>], $target_type, $value_string);
995 Ok(Box::new([<$lib V4MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
996 },
997 #[cfg(feature = "vectord")]
998 Matrix::DVector(lhs) => {
999 $registrar!([<$lib VDMD>], $target_type, $value_string);
1000 Ok(Box::new([<$lib VDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
1001 },
1002 #[cfg(feature = "row_vector2")]
1003 Matrix::RowVector2(lhs) => {
1004 $registrar!([<$lib R2MD>], $target_type, $value_string);
1005 Ok(Box::new([<$lib R2MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
1006 },
1007 #[cfg(feature = "row_vector3")]
1008 Matrix::RowVector3(lhs) => {
1009 $registrar!([<$lib R3MD>], $target_type, $value_string);
1010 Ok(Box::new([<$lib R3MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
1011 },
1012 #[cfg(feature = "row_vector4")]
1013 Matrix::RowVector4(lhs) => {
1014 $registrar!([<$lib R4MD>], $target_type, $value_string);
1015 Ok(Box::new([<$lib R4MD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
1016 },
1017 #[cfg(feature = "row_vectord")]
1018 Matrix::RowDVector(lhs) => {
1019 $registrar!([<$lib RDMD>], $target_type, $value_string);
1020 Ok(Box::new([<$lib RDMD>]{lhs, rhs, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default()))}))
1021 },
1022 _ => {
1023 return Err(
1024 MechError::new(
1025 DimensionMismatch { dims: vec![lhs_shape[0], lhs_shape[1], rows, cols] },
1026 None
1027 ).with_compiler_loc()
1028 );
1029 }
1030 }
1031 }
1032 )+
1033 )+
1034 (lhs,rhs) => Err(MechError::new(
1035 UnhandledFunctionArgumentKind2{arg: (lhs.kind(), rhs.kind()), fxn_name: stringify!($lib).to_string()},
1036 None
1037 ).with_compiler_loc()),
1038 }
1039 }
1040 }
1041}
1042
1043#[macro_export]
1044macro_rules! impl_urnop_match_arms {
1045 ($lib:tt, $arg:tt, $($lhs_type:tt, $($target_type:tt, $value_string:tt),+);+ $(;)?) => {
1046 paste!{
1047 match $arg {
1048 $(
1049 $(
1050 #[cfg(feature = $value_string)]
1051 (Value::$lhs_type(arg)) => Ok(Box::new([<$lib S>]{arg: arg.clone(), out: Ref::new($target_type::default()), _marker: PhantomData::default() })),
1052 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1053 (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() })),
1054 #[cfg(all(feature = $value_string, feature = "matrix2"))]
1055 (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() })),
1056 #[cfg(all(feature = $value_string, feature = "matrix3"))]
1057 (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() })),
1058 #[cfg(all(feature = $value_string, feature = "matrix4"))]
1059 (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() })),
1060 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1061 (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() })),
1062 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1063 (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() })),
1064 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1065 (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() })),
1066 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1067 (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() })),
1068 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1069 (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() })),
1070 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1071 (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() })),
1072 #[cfg(all(feature = $value_string, feature = "vector2"))]
1073 (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() })),
1074 #[cfg(all(feature = $value_string, feature = "vector3"))]
1075 (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() })),
1076 #[cfg(all(feature = $value_string, feature = "vector4"))]
1077 (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() })),
1078 #[cfg(all(feature = $value_string, feature = "vectord"))]
1079 (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() })),
1080 #[cfg(all(feature = $value_string, feature = "matrixd"))]
1081 (Value::[<Matrix $lhs_type>](Matrix::DMatrix(arg))) => {
1082 let (rows,cols) = {arg.borrow().shape()};
1083 Ok(Box::new([<$lib V>]{arg, out: Ref::new(DMatrix::from_element(rows,cols,$target_type::default())), _marker: PhantomData::default() }))},
1084 )+
1085 )+
1086 x => Err(MechError::new(
1087 UnhandledFunctionArgumentKind1{arg: x.kind(), fxn_name: stringify!($lib).to_string()},
1088 None
1089 ).with_compiler_loc()),
1090 }
1091 }
1092 }
1093}
1094
1095#[macro_export]
1096macro_rules! impl_mech_binop_fxn {
1097 ($fxn_name:ident, $gen_fxn:tt, $fxn_string:tt) => {
1098 pub struct $fxn_name {}
1099 impl NativeFunctionCompiler for $fxn_name {
1100 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1101 if arguments.len() != 2 {
1102 return Err(MechError::new(IncorrectNumberOfArguments { expected: 2, found: arguments.len() }, None).with_compiler_loc());
1103 }
1104 let lhs_value = arguments[0].clone();
1105 let rhs_value = arguments[1].clone();
1106 match $gen_fxn(lhs_value.clone(), rhs_value.clone()) {
1107 Ok(fxn) => Ok(fxn),
1108 Err(_) => {
1109 match (lhs_value,rhs_value) {
1110 (Value::MutableReference(lhs),Value::MutableReference(rhs)) => {$gen_fxn(lhs.borrow().clone(), rhs.borrow().clone())}
1111 (lhs_value,Value::MutableReference(rhs)) => { $gen_fxn(lhs_value.clone(), rhs.borrow().clone())}
1112 (Value::MutableReference(lhs),rhs_value) => { $gen_fxn(lhs.borrow().clone(), rhs_value.clone()) }
1113 (lhs, rhs) => {
1114 if let Some(rhs_converted) = rhs.convert_to(&lhs.kind()) {
1115 if let Ok(fxn) = $gen_fxn(lhs.clone(), rhs_converted) {
1116 return Ok(fxn);
1117 }
1118 }
1119 if let Some(lhs_converted) = lhs.convert_to(&rhs.kind()) {
1120 if let Ok(fxn) = $gen_fxn(lhs_converted, rhs.clone()) {
1121 return Ok(fxn);
1122 }
1123 }
1124 Err(MechError::new(
1125 UnhandledFunctionArgumentKind2 { arg: (lhs.kind(), rhs.kind()), fxn_name: stringify!($fxn_name).to_string() },
1126 None
1127 ).with_compiler_loc()
1128 )
1129 },
1130 }
1131 }
1132 }
1133 }
1134 }
1135 #[cfg(not(target_arch = "wasm32"))]
1136 inventory::submit! {
1137 FunctionCompilerDescriptor {
1138 name: $fxn_string,
1139 ptr: &$fxn_name{},
1140 }
1141 }
1142 };
1143}
1144
1145#[macro_export]
1146macro_rules! impl_mech_urnop_fxn {
1147 ($fxn_name:ident, $gen_fxn:tt, $fxn_string:tt) => {
1148 pub struct $fxn_name {}
1149 impl NativeFunctionCompiler for $fxn_name {
1150 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1151 if arguments.len() != 1 {
1152 return Err(MechError::new(IncorrectNumberOfArguments { expected: 1, found: arguments.len() }, None).with_compiler_loc());
1153 }
1154 let input = arguments[0].clone();
1155 match $gen_fxn(input.clone()) {
1156 Ok(fxn) => Ok(fxn),
1157 Err(_) => {
1158 match (input) {
1159 (Value::MutableReference(input)) => {$gen_fxn(input.borrow().clone())}
1160 x => Err(MechError::new(
1161 UnhandledFunctionArgumentKind1 { arg: x.kind(), fxn_name: stringify!($fxn_name).to_string() },
1162 None
1163 ).with_compiler_loc()
1164 ),
1165 }
1166 }
1167 }
1168 }
1169 }
1170 #[cfg(not(target_arch = "wasm32"))]
1171 inventory::submit! {
1172 FunctionCompilerDescriptor {
1173 name: $fxn_string,
1174 ptr: & $fxn_name{},
1175 }
1176 }
1177 }
1178}
1179
1180#[cfg(feature = "functions")]
1181pub fn box_mech_fxn<T>(r: MResult<Box<T>>) -> MResult<Box<dyn MechFunction>>
1182where
1183 T: MechFunction + 'static,
1184{
1185 r.map(|x| x as Box<dyn MechFunction>)
1186}
1187
1188#[macro_export]
1189macro_rules! register_assign {
1190 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1191 paste! {
1192 register_descriptor! {
1193 FunctionDescriptor {
1194 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1195 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>>::new,
1196 }
1197 }
1198 }
1199 };
1200}
1201
1202#[macro_export]
1203macro_rules! register_assign_s {
1204 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1205 paste! {
1206 register_descriptor! {
1207 FunctionDescriptor {
1208 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1209 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>>::new,
1210 }
1211 }
1212 }
1213 };
1214}
1215
1216#[macro_export]
1217macro_rules! register_assign_srr {
1218 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1219 paste! {
1220 register_descriptor! {
1221 FunctionDescriptor {
1222 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1223 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>,$row3<usize>>::new,
1224 }
1225 }
1226 }
1227 };
1228}
1229
1230#[macro_export]
1231macro_rules! register_assign_srr_b {
1232 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1233 paste! {
1234 register_descriptor! {
1235 FunctionDescriptor {
1236 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1237 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>,$row3<bool>>::new,
1238 }
1239 }
1240 }
1241 };
1242}
1243
1244#[macro_export]
1245macro_rules! register_assign_srr_bu {
1246 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1247 paste! {
1248 register_descriptor! {
1249 FunctionDescriptor {
1250 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1251 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>,$row3<usize>>::new,
1252 }
1253 }
1254 }
1255 };
1256}
1257
1258#[macro_export]
1259macro_rules! register_assign_srr_ub {
1260 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1261 paste! {
1262 register_descriptor! {
1263 FunctionDescriptor {
1264 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1265 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<usize>,$row3<bool>>::new,
1266 }
1267 }
1268 }
1269 };
1270}
1271
1272#[macro_export]
1273macro_rules! register_assign_srr_b2 {
1274 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1275 paste! {
1276 register_descriptor! {
1277 FunctionDescriptor {
1278 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1279 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>,$row4<bool>>::new,
1280 }
1281 }
1282 }
1283 };
1284}
1285
1286#[macro_export]
1287macro_rules! register_assign_srr_bu2 {
1288 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1289 paste! {
1290 register_descriptor! {
1291 FunctionDescriptor {
1292 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1293 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>,$row4<usize>>::new,
1294 }
1295 }
1296 }
1297 };
1298}
1299
1300#[macro_export]
1301macro_rules! register_assign_srr_ub2 {
1302 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1303 paste! {
1304 register_descriptor! {
1305 FunctionDescriptor {
1306 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1307 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>,$row4<bool>>::new,
1308 }
1309 }
1310 }
1311 };
1312}
1313
1314#[macro_export]
1315macro_rules! register_assign_srr2 {
1316 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt, $row4:tt) => {
1317 paste! {
1318 register_descriptor! {
1319 FunctionDescriptor {
1320 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), stringify!($row4), ">") ,
1321 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<usize>,$row4<usize>>::new,
1322 }
1323 }
1324 }
1325 };
1326}
1327
1328#[macro_export]
1329macro_rules! register_assign_s1 {
1330 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt) => {
1331 paste! {
1332 register_descriptor! {
1333 FunctionDescriptor {
1334 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), ">") ,
1335 ptr: $fxn_name::<$scalar,$row1<$scalar>>::new,
1336 }
1337 }
1338 }
1339 };
1340}
1341
1342#[macro_export]
1343macro_rules! register_assign_s2 {
1344 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1345 paste! {
1346 register_descriptor! {
1347 FunctionDescriptor {
1348 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1349 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>>::new,
1350 }
1351 }
1352 }
1353 };
1354}
1355
1356#[macro_export]
1357macro_rules! register_assign_b {
1358 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt, $row3:tt) => {
1359 paste! {
1360 register_descriptor! {
1361 FunctionDescriptor {
1362 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), stringify!($row3), ">") ,
1363 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<$scalar>,$row3<bool>>::new,
1364 }
1365 }
1366 }
1367 };
1368}
1369
1370#[macro_export]
1371macro_rules! register_assign_s_b {
1372 ($fxn_name:tt, $scalar:tt, $scalar_string:tt, $row1:tt, $row2:tt) => {
1373 paste! {
1374 register_descriptor! {
1375 FunctionDescriptor {
1376 name: concat!(stringify!($fxn_name), "<", $scalar_string , stringify!($row1), stringify!($row2), ">") ,
1377 ptr: $fxn_name::<$scalar,$row1<$scalar>,$row2<bool>>::new,
1378 }
1379 }
1380 }
1381 };
1382}
1383
1384#[macro_export]
1385macro_rules! impl_assign_fxn {
1386 ($op:tt, $fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {{
1387 let mut res: MResult<_> = Err(MechError::new(
1388 GenericError {
1389 msg: "No matching types found".to_string(),
1390 },
1391 None,
1392 ).with_compiler_loc());
1393
1394 #[cfg(feature = "row_vector2")]
1395 {
1396 res = res.or_else(|_| $op!($fxn_name, RowVector2, &$arg, $value_kind, $value_string));
1397 }
1398
1399 #[cfg(feature = "row_vector3")]
1400 {
1401 res = res.or_else(|_| $op!($fxn_name, RowVector3, &$arg, $value_kind, $value_string));
1402 }
1403
1404 #[cfg(feature = "row_vector4")]
1405 {
1406 res = res.or_else(|_| $op!($fxn_name, RowVector4, &$arg, $value_kind, $value_string));
1407 }
1408
1409 #[cfg(feature = "vector2")]
1410 {
1411 res = res.or_else(|_| $op!($fxn_name, Vector2, &$arg, $value_kind, $value_string));
1412 }
1413
1414 #[cfg(feature = "vector3")]
1415 {
1416 res = res.or_else(|_| $op!($fxn_name, Vector3, &$arg, $value_kind, $value_string));
1417 }
1418
1419 #[cfg(feature = "vector4")]
1420 {
1421 res = res.or_else(|_| $op!($fxn_name, Vector4, &$arg, $value_kind, $value_string));
1422 }
1423
1424 #[cfg(feature = "matrix1")]
1425 {
1426 res = res.or_else(|_| $op!($fxn_name, Matrix1, &$arg, $value_kind, $value_string));
1427 }
1428
1429 #[cfg(feature = "matrix2")]
1430 {
1431 res = res.or_else(|_| $op!($fxn_name, Matrix2, &$arg, $value_kind, $value_string));
1432 }
1433
1434 #[cfg(feature = "matrix3")]
1435 {
1436 res = res.or_else(|_| $op!($fxn_name, Matrix3, &$arg, $value_kind, $value_string));
1437 }
1438
1439 #[cfg(feature = "matrix4")]
1440 {
1441 res = res.or_else(|_| $op!($fxn_name, Matrix4, &$arg, $value_kind, $value_string));
1442 }
1443
1444 #[cfg(feature = "matrix2x3")]
1445 {
1446 res = res.or_else(|_| $op!($fxn_name, Matrix2x3, &$arg, $value_kind, $value_string));
1447 }
1448
1449 #[cfg(feature = "matrix3x2")]
1450 {
1451 res = res.or_else(|_| $op!($fxn_name, Matrix3x2, &$arg, $value_kind, $value_string));
1452 }
1453
1454 #[cfg(feature = "matrixd")]
1455 {
1456 res = res.or_else(|_| $op!($fxn_name, DMatrix, &$arg, $value_kind, $value_string));
1457 }
1458
1459 #[cfg(feature = "row_vectord")]
1460 {
1461 res = res.or_else(|_| $op!($fxn_name, RowDVector, &$arg, $value_kind, $value_string));
1462 }
1463
1464 #[cfg(feature = "vectord")]
1465 {
1466 res = res.or_else(|_| $op!($fxn_name, DVector, &$arg, $value_kind, $value_string));
1467 }
1468 let &(ref source, ref ixes, ref sink) = &$arg;
1469 res.map_err(|_| MechError::new(
1470 UnhandledFunctionArgumentIxes {
1471 arg: (sink.kind(), ixes.iter().map(|x| x.kind()).collect(), source.kind()),
1472 fxn_name: stringify!($fxn_name).to_string(),
1473 },
1474 None,
1475 ).with_compiler_loc())
1476 }}
1477}
1478
1479#[macro_export]
1480macro_rules! impl_assign_scalar_arms {
1481 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1482 paste! {
1483 match $arg {
1484 #[cfg(all(feature = $value_string))]
1486 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
1487 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1488 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1489 },
1490 (sink, ixes, source) => Err(MechError::new(
1491 UnhandledFunctionArgumentIxes { arg: (sink.kind(), ixes.iter().map(|x| x.kind()).collect(), source.kind()), fxn_name: stringify!($fxn_name).to_string() },
1492 None
1493 ).with_compiler_loc()),
1494 }
1495 };
1496 };
1497}
1498
1499#[macro_export]
1500macro_rules! impl_assign_all_arms {
1501 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1502 paste! {
1503 match $arg {
1504 #[cfg(feature = $value_string)]
1505 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1506 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1507 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), _marker: PhantomData::default() })))
1508 },
1509 (sink, ixes, source) => Err(MechError::new(
1510 UnhandledFunctionArgumentIxes { arg: (sink.kind(), ixes.iter().map(|x| x.kind()).collect(), source.kind()), fxn_name: stringify!($fxn_name).to_string() },
1511 None
1512 ).with_compiler_loc()),
1513 }
1514 };
1515 };
1516}
1517
1518#[macro_export]
1519macro_rules! impl_assign_scalar_scalar_arms {
1520 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1521 paste! {
1522 match $arg {
1523 #[cfg(feature = $value_string)]
1524 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1525 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, $shape);
1526 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1527 },
1528 #[cfg(all(feature = $value_string, feature = "matrixd", not(feature = "matrix1")))]
1529 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DMatrix(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1530 register_assign_s!([<$fxn_name MD>], $value_kind, $value_string, $shape, DMatrix);
1531 box_mech_fxn(Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1532 },
1533 (sink, ixes, source) => Err(MechError::new(
1534 UnhandledFunctionArgumentIxes { arg: (sink.kind(), ixes.iter().map(|x| x.kind()).collect(), source.kind()), fxn_name: stringify!($fxn_name).to_string() },
1535 None
1536 ).with_compiler_loc()),
1537 }
1538 };
1539 };
1540}
1541
1542#[macro_export]
1543macro_rules! impl_set_range_arms {
1544 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1545 paste! {
1546 match $arg {
1547 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1549 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
1550 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1551 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1552 },
1553 #[cfg(all(feature = $value_string, feature = "vector2"))]
1554 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
1555 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1556 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1557 },
1558 #[cfg(all(feature = $value_string, feature = "vector3"))]
1559 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
1560 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1561 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1562 },
1563 #[cfg(all(feature = $value_string, feature = "vector4"))]
1564 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
1565 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1566 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1567 },
1568 #[cfg(all(feature = $value_string, feature = "vectord"))]
1569 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
1570 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1571 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1572 },
1573 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1575 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1576 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1577 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1578 },
1579 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
1580 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1581 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1582 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1583 },
1584 #[cfg(all(feature = $value_string, feature = "matrix3"))]
1585 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1586 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1587 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1588 },
1589 #[cfg(all(feature = $value_string, feature = "matrix4"))]
1590 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1591 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1592 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1593 },
1594 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1595 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
1596 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1597 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1598 },
1599 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1600 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
1601 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1602 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1603 },
1604 #[cfg(all(feature = $value_string, feature = "matrixd"))]
1605 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
1606 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1607 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1608 },
1609 #[cfg(all(feature = $value_string, feature = "vectord"))]
1610 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
1611 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1612 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1613 },
1614 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1615 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
1616 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1617 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1618 },
1619 #[cfg(all(feature = $value_string, feature = "vector2"))]
1620 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1621 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1622 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1623 },
1624 #[cfg(all(feature = $value_string, feature = "vector3"))]
1625 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1626 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1627 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1628 },
1629 #[cfg(all(feature = $value_string, feature = "vector4"))]
1630 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1631 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1632 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1633 },
1634 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1635 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1636 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1637 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1638 },
1639 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1640 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1641 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1642 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1643 },
1644 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1645 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1646 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1647 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1648 },
1649 (source, ixes, sink) => Err(MechError::new(
1650 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
1651 None
1652 ).with_compiler_loc()),
1653 }
1654 };
1655 };
1656}
1657
1658#[macro_export]
1659macro_rules! impl_assign_all_arms_b {
1660 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1661 paste! {
1662 match $arg {
1663 #[cfg(feature = $value_string)]
1664 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Bool(ix)], Value::[<$value_kind:camel>](source)) => {
1665 register_assign_s1!([<$fxn_name B>], $value_kind, $value_string, $shape);
1666 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1667 },
1668 #[cfg(feature = $value_string)]
1670 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Bool(ix)], Value::[<Matrix $value_kind:camel>](Matrix::$shape(source))) => {
1671 register_assign_s2!([<$fxn_name VB>], $value_kind, $value_string, $shape, $shape);
1672 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1673 },
1674 (sink, ixes, source) => Err(MechError::new(
1675 UnhandledFunctionArgumentIxes { arg: (sink.kind(), ixes.iter().map(|x| x.kind()).collect(), source.kind()), fxn_name: stringify!($fxn_name).to_string() },
1676 None
1677 ).with_compiler_loc()),
1678 }
1679 };
1680 };
1681}
1682
1683#[macro_export]
1684macro_rules! impl_set_range_all_arms {
1685 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1686 paste! {
1687 match $arg {
1688 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1689 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1690 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1691 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1692 },
1693 #[cfg(all(feature = $value_string, feature = "vector2"))]
1694 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1695 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1696 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1697 },
1698 #[cfg(all(feature = $value_string, feature = "vector3"))]
1699 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1700 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1701 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1702 },
1703 #[cfg(all(feature = $value_string, feature = "vector4"))]
1704 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1705 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1706 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1707 },
1708 #[cfg(all(feature = $value_string, feature = "vectord"))]
1709 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
1710 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1711 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
1712 },
1713 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1714 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1715 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1716 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1717 },
1718 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
1719 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1720 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1721 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1722 },
1723 #[cfg(all(feature = $value_string, feature = "matrix3"))]
1724 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1725 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1726 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1727 },
1728 #[cfg(all(feature = $value_string, feature = "matrix4"))]
1729 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1730 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1731 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1732 },
1733 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1734 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
1735 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1736 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1737 },
1738 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1739 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
1740 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1741 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1742 },
1743 #[cfg(all(feature = $value_string, feature = "matrixd"))]
1744 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
1745 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1746 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1747 },
1748 #[cfg(all(feature = $value_string, feature = "vectord"))]
1749 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
1750 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1751 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1752 },
1753 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
1754 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
1755 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1756 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1757 },
1758 #[cfg(all(feature = $value_string, feature = "vector2"))]
1759 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1760 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1761 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1762 },
1763 #[cfg(all(feature = $value_string, feature = "vector3"))]
1764 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1765 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1766 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1767 },
1768 #[cfg(all(feature = $value_string, feature = "vector4"))]
1769 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1770 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1771 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1772 },
1773 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1774 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1775 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1776 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1777 },
1778 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1779 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1780 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1781 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1782 },
1783 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1784 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix)),Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1785 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1786 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
1787 },
1788 (source, ixes, sink) => Err(MechError::new(
1789 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
1790 None
1791 ).with_compiler_loc()),
1792 }
1793 };
1794 };
1795}
1796
1797#[macro_export]
1798macro_rules! impl_assign_range_scalar_arms {
1799 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1800 paste! {
1801 match $arg {
1802 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1803 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1804 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1805 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1806 },
1807 #[cfg(all(feature = $value_string, feature = "vector2"))]
1808 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1809 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1810 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1811 },
1812 #[cfg(all(feature = $value_string, feature = "vector3"))]
1813 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1814 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
1815 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1816 },
1817 #[cfg(all(feature = $value_string, feature = "vector4"))]
1818 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1819 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
1820 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1821 },
1822 #[cfg(all(feature = $value_string, feature = "matrixd"))]
1823 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DMatrix(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1824 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DMatrix);
1825 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1826 },
1827 #[cfg(all(feature = $value_string, feature = "vectord"))]
1828 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixIndex(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
1829 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
1830 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1831 },
1832 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1833 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1834 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1835 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1836 },
1837 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
1838 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1839 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1840 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1841 },
1842 #[cfg(all(feature = $value_string, feature = "matrix3"))]
1843 (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() => {
1844 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1845 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1846 },
1847 #[cfg(all(feature = $value_string, feature = "matrix4"))]
1848 (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() => {
1849 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1850 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1851 },
1852 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1853 (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() => {
1854 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1855 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1856 },
1857 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1858 (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() => {
1859 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1860 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1861 },
1862 #[cfg(all(feature = $value_string, feature = "vector2"))]
1863 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1864 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1865 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1866 },
1867 #[cfg(all(feature = $value_string, feature = "vector3"))]
1868 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1869 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1870 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1871 },
1872 #[cfg(all(feature = $value_string, feature = "vector4"))]
1873 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1874 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1875 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1876 },
1877 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1878 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1879 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1880 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1881 },
1882 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
1883 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
1884 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
1885 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1886 },
1887 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
1888 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
1889 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
1890 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1891 },
1892 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
1893 (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() => {
1894 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
1895 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1896 },
1897 #[cfg(all(feature = $value_string, feature = "vectord"))]
1898 (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() => {
1899 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
1900 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1901 },
1902 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
1903 (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() => {
1904 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
1905 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1906 },
1907 (source, ixes, sink) => Err(MechError::new(
1908 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
1909 None
1910 ).with_compiler_loc()),
1911 }
1912 };
1913 };
1914}
1915
1916#[macro_export]
1917macro_rules! impl_assign_scalar_range_arms {
1918 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
1919 paste! {
1920 match $arg {
1921 #[cfg(all(feature = $value_string, feature = "matrix1"))]
1922 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
1923 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
1924 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1925 },
1926 #[cfg(all(feature = $value_string, feature = "vector2"))]
1927 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
1928 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
1929 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
1930 },
1931 #[cfg(all(feature = $value_string, feature = "vector3"))]
1932 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
1933 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
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 = "vector4"))]
1937 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
1938 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
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 = "matrixd", not(feature = "matrix1")))]
1942 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::DMatrix(ix2))], Value::[<$value_kind:camel>](source)) => {
1943 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DMatrix);
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 = "vectord"))]
1947 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
1948 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
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"))]
1952 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
1953 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
1954 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1955 },
1956 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
1957 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
1958 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
1959 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1960 },
1961 #[cfg(all(feature = $value_string, feature = "matrix3"))]
1962 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
1963 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
1964 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1965 },
1966 #[cfg(all(feature = $value_string, feature = "matrix4"))]
1967 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
1968 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
1969 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1970 },
1971 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
1972 (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() => {
1973 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
1974 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1975 },
1976 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
1977 (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() => {
1978 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
1979 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1980 },
1981 #[cfg(all(feature = $value_string, feature = "vector2"))]
1982 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
1983 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
1984 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1985 },
1986 #[cfg(all(feature = $value_string, feature = "vector3"))]
1987 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
1988 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
1989 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1990 },
1991 #[cfg(all(feature = $value_string, feature = "vector4"))]
1992 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
1993 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
1994 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
1995 },
1996 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
1997 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
1998 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
1999 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2000 },
2001 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2002 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2003 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
2004 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2005 },
2006 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2007 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2008 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
2009 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2010 },
2011 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
2012 (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() => {
2013 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
2014 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2015 },
2016 #[cfg(all(feature = $value_string, feature = "vectord"))]
2017 (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() => {
2018 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
2019 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2020 },
2021 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
2022 (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() => {
2023 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
2024 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2025 },
2026 (sink, ixes, source) => Err(MechError::new(
2027 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
2028 None
2029 ).with_compiler_loc()),
2030 }
2031 };
2032 };
2033}
2034
2035pub fn check_index_lengths<Ix1, Ix2, Source, A, B, C>(
2036 ix1: &Ref<Ix1>,
2037 ix2: &Ref<Ix2>,
2038 source: &Ref<Source>
2039) -> MResult<()>
2040where
2041 Ix1: AsRef<[A]>,
2042 Ix2: AsRef<[B]>,
2043 Source: AsRef<[C]>,
2044{
2045 let ix1_len = ix1.borrow().as_ref().len();
2046 let ix2_len = ix2.borrow().as_ref().len();
2047 let source_len = source.borrow().as_ref().len();
2048
2049 if ix1_len * ix2_len != source_len {
2050 return Err(
2051 MechError::new(
2052 MismatchedIndexLengthsError {
2053 ix1_len,
2054 ix2_len,
2055 source_len,
2056 },
2057 None
2058 )
2059 .with_compiler_loc()
2060 );
2061 }
2062 Ok(())
2063}
2064
2065#[derive(Debug, Clone)]
2066pub struct MismatchedIndexLengthsError {
2067 pub ix1_len: usize,
2068 pub ix2_len: usize,
2069 pub source_len: usize,
2070}
2071impl MechErrorKind for MismatchedIndexLengthsError {
2072 fn name(&self) -> &str { "MismatchedIndexLengths" }
2073
2074 fn message(&self) -> String {
2075 format!(
2076 "Mismatched lengths for indexed assignment: ix1 length ({}) * ix2 length ({}) \
2077 must equal source length ({})",
2078 self.ix1_len, self.ix2_len, self.source_len
2079 )
2080 }
2081}
2082
2083#[macro_export]
2084macro_rules! impl_assign_range_range_arms {
2085 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
2086 paste! {
2087 match $arg {
2088 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2090 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2091 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
2092 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2093 },
2094 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2"))]
2095 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2096 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector2);
2097 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2098 },
2099 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector3"))]
2100 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2101 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector3);
2102 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2103 },
2104 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector4"))]
2105 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2106 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, Vector4);
2107 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2108 },
2109 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vectord"))]
2110 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Matrix1(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2111 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1, DVector);
2112 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2113 },
2114 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix1"))]
2115 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2116 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Matrix1);
2117 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2118 },
2119 #[cfg(all(feature = $value_string, feature = "vector2"))]
2120 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2121 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector2);
2122 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2123 },
2124 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3"))]
2125 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2126 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector3);
2127 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2128 },
2129 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4"))]
2130 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2131 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, Vector4);
2132 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2133 },
2134 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord"))]
2135 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector2(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2136 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2, DVector);
2137 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2138 },
2139 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1"))]
2140 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2141 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Matrix1);
2142 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2143 },
2144 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2"))]
2145 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2146 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector2);
2147 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2148 },
2149 #[cfg(all(feature = $value_string, feature = "vector3"))]
2150 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2151 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector3);
2152 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2153 },
2154 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4"))]
2155 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2156 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, Vector4);
2157 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2158 },
2159 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord"))]
2160 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector3(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2161 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3, DVector);
2162 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2163 },
2164 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1"))]
2165 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2166 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Matrix1);
2167 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2168 },
2169 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2"))]
2170 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2171 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector2);
2172 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2173 },
2174 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3"))]
2175 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2176 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector3);
2177 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2178 },
2179 #[cfg(all(feature = $value_string, feature = "vector4"))]
2180 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2181 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, Vector4);
2182 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2183 },
2184 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2185 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::Vector4(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2186 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4, DVector);
2187 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2188 },
2189 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1"))]
2190 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
2191 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Matrix1);
2192 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2193 },
2194 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2"))]
2195 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
2196 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector2);
2197 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2198 },
2199 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3"))]
2200 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
2201 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector3);
2202 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2203 },
2204 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4"))]
2205 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
2206 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, Vector4);
2207 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2208 },
2209 #[cfg(all(feature = $value_string, feature = "vectord"))]
2210 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)), Value::MatrixIndex(Matrix::DVector(ix2))], Value::[<$value_kind:camel>](source)) => {
2211 register_assign_srr!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector, DVector);
2212 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2213 },
2214 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2216 (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))) => {
2217 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1, Matrix1);
2218 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2219 },
2220 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2"))]
2221 (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))) => {
2222 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Matrix1, 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 = "matrix1", feature = "row_vector2"))]
2226 (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))) => {
2227 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Matrix1, Vector2);
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 = "matrix1", feature = "vector3"))]
2231 (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))) => {
2232 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Matrix1, Vector3);
2233 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2234 },
2235 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vector3"))]
2236 (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))) => {
2237 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Matrix1, Vector3);
2238 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2239 },
2240 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector4"))]
2241 (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))) => {
2242 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Matrix1, Vector4);
2243 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2244 },
2245 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vector2", feature = "matrix2"))]
2246 (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))) => {
2247 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Matrix1, Vector2);
2248 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2249 },
2250 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vector4"))]
2251 (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))) => {
2252 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Matrix1, Vector4);
2253 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2254 },
2255 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "vectord"))]
2256 (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))) => {
2257 check_index_lengths(&ix1, &ix2, &source)?;
2258 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Matrix1, DVector);
2259 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2260 },
2261 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "row_vectord"))]
2262 (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))) => {
2263 check_index_lengths(&ix1, &ix2, &source)?;
2264 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Matrix1, DVector);
2265 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2266 },
2267 #[cfg(all(feature = $value_string, feature = "matrix1", feature = "matrixd"))]
2268 (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))) => {
2269 check_index_lengths(&ix1, &ix2, &source)?;
2270 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Matrix1, DVector);
2271 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2272 },
2273 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix1", feature = "vector2"))]
2274 (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))) => {
2275 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2, Matrix1);
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 = "vector2", feature = "matrix1", feature = "row_vector2"))]
2279 (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))) => {
2280 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2, 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 = "vector2", feature = "vector4"))]
2284 (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))) => {
2285 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector2, Vector2);
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 = "vector2", feature = "row_vector4"))]
2289 (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))) => {
2290 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector2, Vector2);
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 = "vector2", feature = "vector3", feature = "matrix2x3"))]
2294 (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))) => {
2295 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, Vector2, Vector3);
2296 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2297 },
2298 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "matrix3x2"))]
2299 (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))) => {
2300 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, Vector2, Vector3);
2301 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2302 },
2303 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "vectord"))]
2304 (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))) => {
2305 check_index_lengths(&ix1, &ix2, &source)?;
2306 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, Vector3);
2307 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2308 },
2309 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector3", feature = "row_vectord"))]
2310 (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))) => {
2311 check_index_lengths(&ix1, &ix2, &source)?;
2312 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, Vector3);
2313 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2314 },
2315 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "vectord"))]
2316 (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))) => {
2317 check_index_lengths(&ix1, &ix2, &source)?;
2318 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, Vector4);
2319 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2320 },
2321 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "row_vectord"))]
2322 (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))) => {
2323 check_index_lengths(&ix1, &ix2, &source)?;
2324 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, Vector4);
2325 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2326 },
2327 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector4", feature = "matrixd"))]
2328 (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))) => {
2329 check_index_lengths(&ix1, &ix2, &source)?;
2330 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector2, Vector4);
2331 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2332 },
2333 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "vectord"))]
2334 (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))) => {
2335 check_index_lengths(&ix1, &ix2, &source)?;
2336 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector2, DVector);
2337 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2338 },
2339 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "row_vectord"))]
2340 (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))) => {
2341 check_index_lengths(&ix1, &ix2, &source)?;
2342 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector2, DVector);
2343 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2344 },
2345 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vectord", feature = "matrixd"))]
2346 (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))) => {
2347 check_index_lengths(&ix1, &ix2, &source)?;
2348 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector2, DVector);
2349 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2350 },
2351 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1", feature = "vector3"))]
2352 (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))) => {
2353 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3, Matrix1);
2354 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2355 },
2356 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix1", feature = "row_vector3"))]
2357 (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))) => {
2358 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3, Matrix1);
2359 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2360 },
2361 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "matrix2x3"))]
2362 (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))) => {
2363 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, Vector3, Vector2);
2364 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2365 },
2366 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "matrix3x2"))]
2367 (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))) => {
2368 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, Vector3, Vector2);
2369 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2370 },
2371 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "vectord"))]
2372 (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))) => {
2373 check_index_lengths(&ix1, &ix2, &source)?;
2374 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, Vector2);
2375 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2376 },
2377 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector2", feature = "row_vectord"))]
2378 (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))) => {
2379 check_index_lengths(&ix1, &ix2, &source)?;
2380 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, Vector2);
2381 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2382 },
2383 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2384 (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))) => {
2385 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, Vector3, Vector3);
2386 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2387 },
2388 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord"))]
2389 (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))) => {
2390 check_index_lengths(&ix1, &ix2, &source)?;
2391 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, DVector);
2392 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2393 },
2394 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "row_vectord"))]
2395 (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))) => {
2396 check_index_lengths(&ix1, &ix2, &source)?;
2397 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, DVector);
2398 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2399 },
2400 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "vectord"))]
2401 (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))) => {
2402 check_index_lengths(&ix1, &ix2, &source)?;
2403 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, Vector4);
2404 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2405 },
2406 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "row_vectord"))]
2407 (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))) => {
2408 check_index_lengths(&ix1, &ix2, &source)?;
2409 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, Vector4);
2410 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2411 },
2412 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector4", feature = "matrixd"))]
2413 (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))) => {
2414 check_index_lengths(&ix1, &ix2, &source)?;
2415 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector3, Vector4);
2416 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2417 },
2418 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "vectord"))]
2419 (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))) => {
2420 check_index_lengths(&ix1, &ix2, &source)?;
2421 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector3, DVector);
2422 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2423 },
2424 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "row_vectord"))]
2425 (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))) => {
2426 check_index_lengths(&ix1, &ix2, &source)?;
2427 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector3, DVector);
2428 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2429 },
2430 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vectord", feature = "matrixd"))]
2431 (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))) => {
2432 check_index_lengths(&ix1, &ix2, &source)?;
2433 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector3, DVector);
2434 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2435 },
2436 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1", feature = "vector4"))]
2437 (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))) => {
2438 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4, Matrix1);
2439 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2440 },
2441 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix1", feature = "row_vector4"))]
2442 (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))) => {
2443 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4, Matrix1);
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 = "vector4", feature = "matrix1", feature = "matrix2"))]
2447 (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))) => {
2448 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4, Matrix1);
2449 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2450 },
2451 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "vectord"))]
2452 (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))) => {
2453 check_index_lengths(&ix1, &ix2, &source)?;
2454 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector2);
2455 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2456 },
2457 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "row_vectord"))]
2458 (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))) => {
2459 check_index_lengths(&ix1, &ix2, &source)?;
2460 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector2);
2461 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2462 },
2463 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector2", feature = "matrixd"))]
2464 (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))) => {
2465 check_index_lengths(&ix1, &ix2, &source)?;
2466 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, Vector2);
2467 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2468 },
2469 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "vectord"))]
2470 (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))) => {
2471 check_index_lengths(&ix1, &ix2, &source)?;
2472 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector3);
2473 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2474 },
2475 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "row_vectord"))]
2476 (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))) => {
2477 check_index_lengths(&ix1, &ix2, &source)?;
2478 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector3);
2479 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2480 },
2481 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector3", feature = "matrixd"))]
2482 (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))) => {
2483 check_index_lengths(&ix1, &ix2, &source)?;
2484 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, Vector3);
2485 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2486 },
2487 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2488 (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))) => {
2489 check_index_lengths(&ix1, &ix2, &source)?;
2490 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, Vector4);
2491 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2492 },
2493 #[cfg(all(feature = $value_string, feature = "vector4", feature = "row_vectord"))]
2494 (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))) => {
2495 check_index_lengths(&ix1, &ix2, &source)?;
2496 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, Vector4);
2497 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2498 },
2499 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrixd"))]
2500 (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))) => {
2501 check_index_lengths(&ix1, &ix2, &source)?;
2502 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, Vector4, DVector);
2503 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2504 },
2505 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vectord"))]
2506 (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))) => {
2507 check_index_lengths(&ix1, &ix2, &source)?;
2508 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, Vector4, DVector);
2509 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2510 },
2511 #[cfg(all(feature = $value_string, feature = "vector4", feature = "row_vectord"))]
2512 (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))) => {
2513 check_index_lengths(&ix1, &ix2, &source)?;
2514 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, Vector4, DVector);
2515 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2516 },
2517 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
2518 (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))) => {
2519 check_index_lengths(&ix1, &ix2, &source)?;
2520 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, Vector4, Vector4);
2521 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2522 },
2523 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "vectord"))]
2524 (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))) => {
2525 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Matrix1);
2526 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2527 },
2528 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "row_vectord"))]
2529 (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))) => {
2530 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Matrix1);
2531 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2532 },
2533 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrix1", feature = "matrixd"))]
2534 (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))) => {
2535 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Matrix1);
2536 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2537 },
2538 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "vectord"))]
2539 (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))) => {
2540 check_index_lengths(&ix1, &ix2, &source)?;
2541 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector2);
2542 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2543 },
2544 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "row_vectord"))]
2545 (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))) => {
2546 check_index_lengths(&ix1, &ix2, &source)?;
2547 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector2);
2548 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2549 },
2550 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector2", feature = "matrixd"))]
2551 (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))) => {
2552 check_index_lengths(&ix1, &ix2, &source)?;
2553 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector2);
2554 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2555 },
2556 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "vectord"))]
2557 (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))) => {
2558 check_index_lengths(&ix1, &ix2, &source)?;
2559 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector3);
2560 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2561 },
2562 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "row_vectord"))]
2563 (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))) => {
2564 check_index_lengths(&ix1, &ix2, &source)?;
2565 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector3);
2566 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2567 },
2568 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector3", feature = "matrixd"))]
2569 (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))) => {
2570 check_index_lengths(&ix1, &ix2, &source)?;
2571 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector3);
2572 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2573 },
2574 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "vectord"))]
2575 (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))) => {
2576 check_index_lengths(&ix1, &ix2, &source)?;
2577 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, Vector4);
2578 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2579 },
2580 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "row_vectord"))]
2581 (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))) => {
2582 check_index_lengths(&ix1, &ix2, &source)?;
2583 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, Vector4);
2584 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2585 },
2586 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vector4", feature = "matrixd"))]
2587 (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))) => {
2588 check_index_lengths(&ix1, &ix2, &source)?;
2589 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, Vector4);
2590 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2591 },
2592 #[cfg(all(feature = $value_string, feature = "vectord"))]
2593 (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))) => {
2594 check_index_lengths(&ix1, &ix2, &source)?;
2595 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector, DVector);
2596 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2597 },
2598 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
2599 (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))) => {
2600 check_index_lengths(&ix1, &ix2, &source)?;
2601 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector, DVector);
2602 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2603 },
2604 #[cfg(all(feature = $value_string, feature = "vectord", feature = "row_vectord"))]
2605 (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))) => {
2606 check_index_lengths(&ix1, &ix2, &source)?;
2607 register_assign_srr2!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector, DVector);
2608 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
2609 },
2610 (source, ixes, sink) => Err(MechError::new(
2611 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
2612 None
2613 ).with_compiler_loc()),
2614 }
2615 };
2616 };
2617}
2618
2619#[macro_export]
2620macro_rules! impl_assign_all_range_arms {
2621 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
2622 paste! {
2623 match $arg {
2624 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2625 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
2626 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Matrix1);
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 = "vector2"))]
2630 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
2631 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector2);
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 = "vector3"))]
2635 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
2636 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector3);
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 = "vector4"))]
2640 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
2641 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, Vector4);
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 = "vectord"))]
2645 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
2646 register_assign_s!([<$fxn_name S>], $value_kind, $value_string, $shape, DVector);
2647 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2648 },
2649 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2650 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2651 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
2652 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2653 },
2654 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
2655 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
2656 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2, Vector4);
2657 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2658 },
2659 #[cfg(all(feature = $value_string, feature = "matrix3"))]
2660 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
2661 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3, DVector);
2662 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2663 },
2664 #[cfg(all(feature = $value_string, feature = "matrix4"))]
2665 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
2666 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix4, DVector);
2667 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2668 },
2669 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2670 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
2671 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
2672 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2673 },
2674 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2675 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
2676 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
2677 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2678 },
2679 #[cfg(all(feature = $value_string, feature = "matrixd"))]
2680 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
2681 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DMatrix, DVector);
2682 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2683 },
2684 #[cfg(all(feature = $value_string, feature = "vectord"))]
2685 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
2686 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, DVector, DVector);
2687 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2688 },
2689 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2690 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
2691 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowDVector, DVector);
2692 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2693 },
2694 #[cfg(all(feature = $value_string, feature = "vector2"))]
2695 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2696 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector2, Vector2);
2697 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2698 },
2699 #[cfg(all(feature = $value_string, feature = "vector3"))]
2700 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2701 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector3, Vector3);
2702 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2703 },
2704 #[cfg(all(feature = $value_string, feature = "vector4"))]
2705 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2706 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, Vector4, Vector4);
2707 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2708 },
2709 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2710 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2711 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector2, Vector2);
2712 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2713 },
2714 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2715 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2716 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector3, Vector3);
2717 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2718 },
2719 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2720 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::IndexAll, Value::MatrixIndex(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2721 register_assign!([<$fxn_name V>], $value_kind, $value_string, $shape, RowVector4, Vector4);
2722 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2723 },
2724 (source, ixes, sink) => Err(MechError::new(
2725 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
2726 None
2727 ).with_compiler_loc()),
2728 }
2729 };
2730 };
2731}
2732
2733#[macro_export]
2734macro_rules! impl_assign_all_scalar_arms {
2735 ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
2736 paste! {
2737 match $arg {
2738 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2739 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2740 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix1);
2741 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2742 },
2743 #[cfg(all(feature = $value_string, feature = "matrix2"))]
2744 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2745 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2);
2746 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2747 },
2748 #[cfg(all(feature = $value_string, feature = "matrix3"))]
2749 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2750 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3);
2751 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2752 },
2753 #[cfg(all(feature = $value_string, feature = "matrix4"))]
2754 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2755 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix4);
2756 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2757 },
2758 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2759 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2760 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2x3);
2761 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2762 },
2763 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2764 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2765 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3x2);
2766 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2767 },
2768 #[cfg(all(feature = $value_string, feature = "matrixd"))]
2769 (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2770 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DMatrix);
2771 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2772 },
2773 #[cfg(all(feature = $value_string, feature = "vectord"))]
2774 (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2775 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DVector);
2776 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2777 },
2778 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2779 (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2780 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowDVector);
2781 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2782 },
2783 #[cfg(all(feature = $value_string, feature = "vector2"))]
2784 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2785 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector2);
2786 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2787 },
2788 #[cfg(all(feature = $value_string, feature = "vector3"))]
2789 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2790 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector3);
2791 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2792 },
2793 #[cfg(all(feature = $value_string, feature = "vector4"))]
2794 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2795 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector4);
2796 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2797 },
2798 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2799 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2800 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector2);
2801 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2802 },
2803 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2804 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2805 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector3);
2806 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2807 },
2808 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2809 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::IndexAll, Value::Index(ix)], Value::[<$value_kind:camel>](source)) => {
2810 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector4);
2811 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2812 },
2813 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2815 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2816 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix1, Matrix1);
2817 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2818 },
2819 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
2820 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2821 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, RowVector2);
2822 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2823 },
2824 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2"))]
2825 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2826 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, Vector2);
2827 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2828 },
2829 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
2830 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2831 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, RowVector3);
2832 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2833 },
2834 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2835 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2836 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, Vector3);
2837 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2838 },
2839 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
2840 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2841 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, RowVector4);
2842 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2843 },
2844 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
2845 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
2846 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, Vector4);
2847 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2848 },
2849 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2x3"))]
2850 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2851 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, RowVector2);
2852 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2853 },
2854 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2x3"))]
2855 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2856 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, Vector2);
2857 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2858 },
2859 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3x2"))]
2860 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2861 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, RowVector3);
2862 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2863 },
2864 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3x2"))]
2865 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2866 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, Vector3);
2867 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2868 },
2869 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
2870 (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() => {
2871 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, DVector);
2872 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2873 },
2874 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrixd"))]
2875 (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() => {
2876 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, RowDVector);
2877 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2878 },
2879 (source, ixes, sink) => Err(MechError::new(
2880 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
2881 None
2882 ).with_compiler_loc()),
2883 }
2884 };
2885 };
2886}
2887
2888#[macro_export]
2889macro_rules! impl_assign_scalar_all_arms {
2890 ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
2891 paste! {
2892 match $arg {
2893 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2894 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2895 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix1);
2896 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2897 },
2898 #[cfg(all(feature = $value_string, feature = "matrix2"))]
2899 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2900 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2);
2901 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2902 },
2903 #[cfg(all(feature = $value_string, feature = "matrix3"))]
2904 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2905 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3);
2906 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2907 },
2908 #[cfg(all(feature = $value_string, feature = "matrix4"))]
2909 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2910 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix4);
2911 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2912 },
2913 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
2914 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2915 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix2x3);
2916 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2917 },
2918 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
2919 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2920 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Matrix3x2);
2921 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2922 },
2923 #[cfg(all(feature = $value_string, feature = "matrixd"))]
2924 (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2925 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DMatrix);
2926 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2927 },
2928 #[cfg(all(feature = $value_string, feature = "vectord"))]
2929 (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2930 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, DVector);
2931 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2932 },
2933 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
2934 (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2935 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowDVector);
2936 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2937 },
2938 #[cfg(all(feature = $value_string, feature = "vector2"))]
2939 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2940 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector2);
2941 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2942 },
2943 #[cfg(all(feature = $value_string, feature = "vector3"))]
2944 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2945 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector3);
2946 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2947 },
2948 #[cfg(all(feature = $value_string, feature = "vector4"))]
2949 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2950 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, Vector4);
2951 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2952 },
2953 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
2954 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2955 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector2);
2956 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2957 },
2958 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
2959 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2960 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector3);
2961 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2962 },
2963 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
2964 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::Index(ix), Value::IndexAll], Value::[<$value_kind:camel>](source)) => {
2965 register_assign_s1!([<$fxn_name S>], $value_kind, $value_string, RowVector4);
2966 box_mech_fxn(Ok(Box::new([<$fxn_name S>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
2967 },
2968 #[cfg(all(feature = $value_string, feature = "matrix1"))]
2970 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
2971 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix1, Matrix1);
2972 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2973 },
2974 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2"))]
2975 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
2976 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, RowVector2);
2977 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2978 },
2979 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix2"))]
2980 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
2981 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2, Vector2);
2982 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2983 },
2984 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3"))]
2985 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
2986 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, RowVector3);
2987 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2988 },
2989 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix3"))]
2990 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
2991 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3, Vector3);
2992 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2993 },
2994 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
2995 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
2996 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, RowVector4);
2997 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
2998 },
2999 #[cfg(all(feature = $value_string, feature = "vector4", feature = "matrix4"))]
3000 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3001 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix4, Vector4);
3002 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3003 },
3004 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix2x3"))]
3005 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3006 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, RowVector3);
3007 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3008 },
3009 #[cfg(all(feature = $value_string, feature = "vector3", feature = "matrix2x3"))]
3010 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3011 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix2x3, Vector3);
3012 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3013 },
3014 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix3x2"))]
3015 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3016 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, RowVector2);
3017 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3018 },
3019 #[cfg(all(feature = $value_string, feature = "vector2", feature = "matrix3x2"))]
3020 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::Index(ix), Value::IndexAll], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3021 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, Matrix3x2, Vector2);
3022 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3023 },
3024 #[cfg(all(feature = $value_string, feature = "vectord", feature = "matrixd"))]
3025 (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() => {
3026 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, DVector);
3027 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3028 },
3029 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrixd"))]
3030 (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() => {
3031 register_assign_s2!([<$fxn_name V>], $value_kind, $value_string, DMatrix, RowDVector);
3032 box_mech_fxn(Ok(Box::new([<$fxn_name V>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3033 },
3034 (source, ixes, sink) => Err(MechError::new(
3035 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3036 None
3037 ).with_compiler_loc()),
3038 }
3039 };
3040 };
3041}
3042
3043#[macro_export]
3044macro_rules! impl_set_all_range_arms_b {
3045 ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
3046 paste! {
3047 match $arg {
3048 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3050 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
3051 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
3052 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3053 },
3054 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
3055 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3056 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector4);
3057 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3058 },
3059 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3060 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3061 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, DVector);
3062 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3063 },
3064 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3065 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3066 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, DVector);
3067 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3068 },
3069 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3070 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3071 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, DVector);
3072 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3073 },
3074 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3075 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3076 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, DVector);
3077 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3078 },
3079 #[cfg(all(feature = $value_string, feature = "matrixd"))]
3080 (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3081 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, DVector);
3082 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3083 },
3084 #[cfg(all(feature = $value_string, feature = "vector2"))]
3085 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3086 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
3087 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3088 },
3089 #[cfg(all(feature = $value_string, feature = "vector3"))]
3090 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3091 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
3092 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3093 },
3094 #[cfg(all(feature = $value_string, feature = "vector4"))]
3095 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3096 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
3097 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3098 },
3099 #[cfg(all(feature = $value_string, feature = "vectord"))]
3100 (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() => {
3101 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
3102 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3103 },
3104 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3105 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3106 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
3107 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3108 },
3109 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3110 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3111 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
3112 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3113 },
3114 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3115 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3116 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
3117 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3118 },
3119 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3120 (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() => {
3121 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
3122 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3123 },
3124 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3126 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3127 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3128 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3129 },
3130 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
3131 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3132 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, Vector2);
3133 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3134 },
3135 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3136 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
3137 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, Vector3);
3138 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3139 },
3140 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3141 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
3142 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, Vector4);
3143 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3144 },
3145 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3146 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
3147 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, Vector3);
3148 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3149 },
3150 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3151 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
3152 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, Vector2);
3153 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3154 },
3155 #[cfg(all(feature = $value_string, feature = "matrixd"))]
3156 (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() => {
3157 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
3158 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3159 },
3160 #[cfg(all(feature = $value_string, feature = "vectord"))]
3161 (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() => {
3162 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
3163 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3164 },
3165 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3166 (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() => {
3167 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
3168 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3169 },
3170 #[cfg(all(feature = $value_string, feature = "vector2"))]
3171 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3172 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector2, Vector2, Vector2);
3173 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3174 },
3175 #[cfg(all(feature = $value_string, feature = "vector3"))]
3176 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3177 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector3, Vector3, Vector3);
3178 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3179 },
3180 #[cfg(all(feature = $value_string, feature = "vector4"))]
3181 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3182 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector4, Vector4, Vector4);
3183 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3184 },
3185 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3186 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3187 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector2, RowVector2, Vector2);
3188 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3189 },
3190 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3191 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3192 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector3, RowVector3, Vector3);
3193 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3194 },
3195 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3196 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::IndexAll, Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3197 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector4, RowVector4, Vector4);
3198 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3199 },
3200 (source, ixes, sink) => Err(MechError::new(
3201 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3202 None
3203 ).with_compiler_loc()),
3204 }
3205 }
3206 }
3207}
3208
3209#[macro_export]
3210macro_rules! impl_set_range_all_arms_b {
3211 ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
3212 paste! {
3213 match $arg {
3214 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3216 (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() => {
3217 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
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 = "matrix2", feature = "vector2"))]
3221 (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() => {
3222 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector2);
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 = "matrix3"))]
3226 (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() => {
3227 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, Vector3);
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 = "matrix4"))]
3231 (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() => {
3232 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, Vector4);
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 = "matrix2x3"))]
3236 (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() => {
3237 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, Vector2);
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 = "matrix3x2"))]
3241 (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() => {
3242 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, Vector3);
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 = "matrixd"))]
3246 (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() => {
3247 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, 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 #[cfg(all(feature = $value_string, feature = "vector2"))]
3251 (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() => {
3252 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
3253 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3254 },
3255 #[cfg(all(feature = $value_string, feature = "vector3"))]
3256 (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() => {
3257 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
3258 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3259 },
3260 #[cfg(all(feature = $value_string, feature = "vector4"))]
3261 (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() => {
3262 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
3263 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3264 },
3265 #[cfg(all(feature = $value_string, feature = "vectord"))]
3266 (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() => {
3267 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
3268 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3269 },
3270 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3271 (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() => {
3272 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
3273 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3274 },
3275 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3276 (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() => {
3277 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
3278 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3279 },
3280 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3281 (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() => {
3282 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
3283 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3284 },
3285 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3286 (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() => {
3287 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
3288 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3289 },
3290 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3292 (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() => {
3293 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
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 = "matrix2", feature = "vector2"))]
3297 (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() => {
3298 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, 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 = "matrix3"))]
3302 (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() => {
3303 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, 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 = "matrix4"))]
3307 (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() => {
3308 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, 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 = "matrix2x3"))]
3312 (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() => {
3313 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, 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 = "matrix3x2"))]
3317 (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() => {
3318 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, 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 = "matrixd"))]
3322 (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() => {
3323 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
3324 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3325 },
3326 #[cfg(all(feature = $value_string, feature = "vectord"))]
3327 (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() => {
3328 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
3329 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3330 },
3331 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3332 (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() => {
3333 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
3334 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3335 },
3336 (source, ixes, sink) => Err(MechError::new(
3337 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3338 None
3339 ).with_compiler_loc()),
3340 }
3341 }
3342 }
3343}
3344
3345#[macro_export]
3346macro_rules! impl_set_range_arms_b {
3347 ($fxn_name:ident, $arg:expr, $value_kind:ident, $value_string:tt) => {
3348 paste! {
3349 match $arg {
3350 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3352 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)),[Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<$value_kind:camel>](source)) => {
3353 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix1, Matrix1);
3354 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3355 },
3356 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
3357 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3358 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2, Vector4);
3359 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3360 },
3361 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3362 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3363 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3, DVector);
3364 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3365 },
3366 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3367 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3368 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix4, DVector);
3369 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3370 },
3371 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3372 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3373 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix2x3, DVector);
3374 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3375 },
3376 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3377 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3378 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Matrix3x2, DVector);
3379 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3380 },
3381 #[cfg(all(feature = $value_string, feature = "matrixd"))]
3382 (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3383 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DMatrix, DVector);
3384 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3385 },
3386 #[cfg(all(feature = $value_string, feature = "vector2"))]
3387 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3388 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector2, Vector2);
3389 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3390 },
3391 #[cfg(all(feature = $value_string, feature = "vector3"))]
3392 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3393 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector3, Vector3);
3394 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3395 },
3396 #[cfg(all(feature = $value_string, feature = "vector4"))]
3397 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3398 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, Vector4, Vector4);
3399 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3400 },
3401 #[cfg(all(feature = $value_string, feature = "vectord"))]
3402 (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3403 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, DVector, DVector);
3404 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3405 },
3406 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3407 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)),[Value::MatrixBool(Matrix::Vector2(ix))], Value::[<$value_kind:camel>](source)) => {
3408 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector2, Vector2);
3409 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3410 },
3411 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3412 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)),[Value::MatrixBool(Matrix::Vector3(ix))], Value::[<$value_kind:camel>](source)) => {
3413 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector3, Vector3);
3414 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3415 },
3416 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3417 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)),[Value::MatrixBool(Matrix::Vector4(ix))], Value::[<$value_kind:camel>](source)) => {
3418 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowVector4, Vector4);
3419 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3420 },
3421 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3422 (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::[<$value_kind:camel>](source)) => {
3423 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, RowDVector, DVector);
3424 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3425 },
3426 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3428 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3429 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3430 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3431 },
3432 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
3433 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3434 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2, Matrix2, Vector4);
3435 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3436 },
3437 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3438 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(source))) => {
3439 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3, Matrix3, DVector);
3440 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3441 },
3442 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3443 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(source))) => {
3444 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix4, Matrix4, DVector);
3445 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3446 },
3447 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3448 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(source))) => {
3449 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, DVector);
3450 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3451 },
3452 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3453 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(source))) => {
3454 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, DVector);
3455 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3456 },
3457 #[cfg(all(feature = $value_string, feature = "matrixd"))]
3458 (Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DMatrix(source))) => {
3459 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DMatrix, DMatrix, DVector);
3460 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3461 },
3462 #[cfg(all(feature = $value_string, feature = "vectord"))]
3463 (Value::[<Matrix $value_kind:camel>](Matrix::DVector(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::DVector(source))) => {
3464 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, DVector, DVector, DVector);
3465 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3466 },
3467 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3468 (Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(sink)), [Value::MatrixBool(Matrix::DVector(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowDVector(source))) => {
3469 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowDVector, RowDVector, DVector);
3470 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3471 },
3472 #[cfg(all(feature = $value_string, feature = "vector2"))]
3473 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3474 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector2, Vector2, Vector2);
3475 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3476 },
3477 #[cfg(all(feature = $value_string, feature = "vector3"))]
3478 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3479 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector3, Vector3, Vector3);
3480 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3481 },
3482 #[cfg(all(feature = $value_string, feature = "vector4"))]
3483 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3484 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, Vector4, Vector4, Vector4);
3485 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3486 },
3487 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3488 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3489 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector2, RowVector2, Vector2);
3490 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3491 },
3492 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3493 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3494 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector3, RowVector3, Vector3);
3495 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3496 },
3497 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3498 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3499 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, RowVector4, RowVector4, Vector4);
3500 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3501 },
3502 (source, ixes, sink) => Err(MechError::new(
3503 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3504 None
3505 ).with_compiler_loc()),
3506 }
3507 };
3508 };
3509}
3510
3511#[macro_export]
3512macro_rules! impl_assign_scalar_arms_b {
3513 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3514 paste! {
3515 match $arg {
3516 #[cfg(feature = $value_string)]
3517 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Bool(ix)], Value::[<$value_kind:camel>](source)) => {
3518 register_assign_s1!([<$fxn_name B>], $value_kind, $value_string, $shape);
3519 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone(), _marker: PhantomData::default() })))
3520 },
3521 #[cfg(feature = $value_string)]
3523 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Bool(ix)], Value::[<Matrix $value_kind:camel>](Matrix::$shape(source))) => {
3524 register_assign_s2!([<$fxn_name VB>], $value_kind, $value_string, $shape, $shape);
3525 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: ix.clone(), _marker: PhantomData::default() })))
3526 },
3527 (source, ixes, sink) => Err(MechError::new(
3528 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3529 None
3530 ).with_compiler_loc()),
3531 }
3532 };
3533 };
3534}
3535
3536#[macro_export]
3537macro_rules! impl_assign_range_scalar_arms_b {
3538 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3539 paste! {
3540 match $arg {
3541 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3542 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3543 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Matrix1);
3544 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3545 },
3546 #[cfg(all(feature = $value_string, feature = "vector2"))]
3547 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3548 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector2);
3549 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3550 },
3551 #[cfg(all(feature = $value_string, feature = "vector3"))]
3552 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3553 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector3);
3554 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3555 },
3556 #[cfg(all(feature = $value_string, feature = "vector4"))]
3557 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3558 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector4);
3559 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3560 },
3561 #[cfg(all(feature = $value_string, feature = "vectord"))]
3562 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::MatrixBool(Matrix::DVector(ix1)), Value::Index(ix2)], Value::[<$value_kind:camel>](source)) => {
3563 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, DVector);
3564 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3565 },
3566 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3567 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3568 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
3569 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3570 },
3571 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
3572 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3573 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2, Vector4);
3574 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3575 },
3576 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3577 (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() => {
3578 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3, DVector);
3579 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3580 },
3581 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3582 (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() => {
3583 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix4, DVector);
3584 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3585 },
3586 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3587 (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() => {
3588 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
3589 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3590 },
3591 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3592 (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() => {
3593 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
3594 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3595 },
3596 #[cfg(all(feature = $value_string, feature = "vector2"))]
3597 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3598 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector2, Vector2);
3599 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3600 },
3601 #[cfg(all(feature = $value_string, feature = "vector3"))]
3602 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3603 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector3, Vector3);
3604 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3605 },
3606 #[cfg(all(feature = $value_string, feature = "vector4"))]
3607 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3608 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector4, Vector4);
3609 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3610 },
3611 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3612 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3613 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector2, Vector2);
3614 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3615 },
3616 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3617 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3618 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector3, Vector3);
3619 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3620 },
3621 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3622 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::Index(ix2)], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3623 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector4, Vector4);
3624 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3625 },
3626 #[cfg(all(feature = $value_string, feature = "vectord"))]
3627 (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() => {
3628 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DVector, DVector);
3629 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3630 },
3631 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord"))]
3632 (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() => {
3633 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowDVector, DVector);
3634 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3635 },
3636 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
3637 (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() => {
3638 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DMatrix, DVector);
3639 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(),ix2.clone()), _marker: PhantomData::default() })))
3640 },
3641 (source, ixes, sink) => Err(MechError::new(
3642 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3643 None
3644 ).with_compiler_loc()),
3645 }
3646 };
3647 };
3648}
3649
3650#[macro_export]
3651macro_rules! impl_assign_scalar_range_arms_b {
3652 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3653 paste! {
3654 match $arg {
3655 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3656 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3657 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Matrix1);
3658 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3659 },
3660 #[cfg(all(feature = $value_string, feature = "vector2"))]
3661 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3662 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector2);
3663 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3664 },
3665 #[cfg(all(feature = $value_string, feature = "vector3"))]
3666 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3667 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector3);
3668 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3669 },
3670 #[cfg(all(feature = $value_string, feature = "vector4"))]
3671 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)),[Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3672 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, Vector4);
3673 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3674 },
3675 #[cfg(all(feature = $value_string, feature = "vectord"))]
3676 (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() => {
3677 register_assign_s_b!([<$fxn_name B>], $value_kind, $value_string, $shape, DVector);
3678 box_mech_fxn(Ok(Box::new([<$fxn_name B>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3679 },
3680 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3681 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(source))) => {
3682 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix1, Matrix1);
3683 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3684 },
3685 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector4"))]
3686 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(source))) => {
3687 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2, Vector4);
3688 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3689 },
3690 #[cfg(all(feature = $value_string, feature = "matrix3"))]
3691 (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() => {
3692 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3, DVector);
3693 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3694 },
3695 #[cfg(all(feature = $value_string, feature = "matrix4"))]
3696 (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() => {
3697 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix4, DVector);
3698 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3699 },
3700 #[cfg(all(feature = $value_string, feature = "matrix2x3"))]
3701 (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() => {
3702 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix2x3, DVector);
3703 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3704 },
3705 #[cfg(all(feature = $value_string, feature = "matrix3x2"))]
3706 (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() => {
3707 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Matrix3x2, DVector);
3708 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3709 },
3710 #[cfg(all(feature = $value_string, feature = "vector2"))]
3711 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector2(source))) => {
3712 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector2, Vector2);
3713 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3714 },
3715 #[cfg(all(feature = $value_string, feature = "vector3"))]
3716 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector3(source))) => {
3717 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector3, Vector3);
3718 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3719 },
3720 #[cfg(all(feature = $value_string, feature = "vector4"))]
3721 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::Vector4(source))) => {
3722 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, Vector4, Vector4);
3723 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3724 },
3725 #[cfg(all(feature = $value_string, feature = "row_vector2"))]
3726 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(source))) => {
3727 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector2, Vector2);
3728 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3729 },
3730 #[cfg(all(feature = $value_string, feature = "row_vector3"))]
3731 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(source))) => {
3732 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector3, Vector3);
3733 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3734 },
3735 #[cfg(all(feature = $value_string, feature = "row_vector4"))]
3736 (Value::[<Matrix $value_kind:camel>](Matrix::$shape(sink)), [Value::Index(ix1), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(source))) => {
3737 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowVector4, Vector4);
3738 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3739 },
3740 #[cfg(all(feature = $value_string, feature = "vectord"))]
3741 (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() => {
3742 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DVector, DVector);
3743 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3744 },
3745 #[cfg(all(feature = $value_string, feature = "row_vectord"))]
3746 (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() => {
3747 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, RowDVector, DVector);
3748 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3749 },
3750 #[cfg(all(feature = $value_string, feature = "matrixd"))]
3751 (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() => {
3752 register_assign_b!([<$fxn_name VB>], $value_kind, $value_string, $shape, DMatrix, DVector);
3753 box_mech_fxn(Ok(Box::new([<$fxn_name VB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3754 },
3755 (source, ixes, sink) => Err(MechError::new(
3756 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3757 None
3758 ).with_compiler_loc()),
3759 }
3760 };
3761 };
3762}
3763
3764#[macro_export]
3765macro_rules! impl_assign_range_range_arms_b {
3766 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3767 paste! {
3768 match $arg {
3769 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3771 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3772 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1);
3773 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3774 },
3775 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix1", feature = "row_vector2"))]
3776 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector2(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3777 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector2, Matrix1, Vector2);
3778 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3779 },
3780 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix1", feature = "row_vector3"))]
3781 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector3(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3782 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector3, Matrix1, Vector3);
3783 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3784 },
3785 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix1", feature = "row_vector4"))]
3786 (Value::[<Matrix $value_kind:camel>](Matrix::RowVector4(sink)), [Value::MatrixBool(Matrix::Matrix1(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3787 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowVector4, Matrix1, Vector4);
3788 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3789 },
3790 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrix1", feature = "row_vectord"))]
3791 (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() => {
3792 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, RowDVector,Matrix1,DVector);
3793 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3794 },
3795 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector2", feature = "matrix1"))]
3796 (Value::[<Matrix $value_kind:camel>](Matrix::Vector2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3797 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector2,Vector2,Matrix1);
3798 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3799 },
3800 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector3", feature = "matrix1"))]
3801 (Value::[<Matrix $value_kind:camel>](Matrix::Vector3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3802 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector3,Vector3,Matrix1);
3803 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3804 },
3805 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector4", feature = "matrix1"))]
3806 (Value::[<Matrix $value_kind:camel>](Matrix::Vector4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Matrix1(ix2))], Value::[<$value_kind:camel>](source)) => {
3807 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Vector4,Vector4,Matrix1);
3808 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3809 },
3810 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vectord", feature = "matrix1"))]
3811 (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() => {
3812 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DVector,DVector,Matrix1);
3813 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3814 },
3815 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
3816 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3817 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2,Vector2,Vector2);
3818 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3819 },
3820 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
3821 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3822 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2,Matrix3,Vector3);
3823 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3824 },
3825 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
3826 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::Vector4(ix1)), Value::MatrixBool(Matrix::Vector4(ix2))], Value::[<$value_kind:camel>](source)) => {
3827 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix4,Vector4,Vector4);
3828 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3829 },
3830 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector3", feature = "vector2"))]
3831 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::Vector2(ix1)), Value::MatrixBool(Matrix::Vector3(ix2))], Value::[<$value_kind:camel>](source)) => {
3832 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix2x3,Vector2,Vector3);
3833 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3834 },
3835 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector2", feature = "vector3"))]
3836 (Value::[<Matrix $value_kind:camel>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::Vector3(ix1)), Value::MatrixBool(Matrix::Vector2(ix2))], Value::[<$value_kind:camel>](source)) => {
3837 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, Matrix3x2,Vector3,Vector2);
3838 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3839 },
3840 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector4", feature = "vector2"))]
3841 (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 => {
3842 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, Vector4, Vector2);
3843 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3844 },
3845 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector2", feature = "vector4"))]
3846 (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 => {
3847 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, Vector2, Vector4);
3848 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3849 },
3850 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector2"))]
3851 (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() => {
3852 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector2);
3853 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3854 },
3855 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector3"))]
3856 (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() => {
3857 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector3);
3858 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3859 },
3860 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector4"))]
3861 (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() => {
3862 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, Vector4);
3863 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3864 },
3865 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3866 (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() => {
3867 register_assign_srr_b!([<$fxn_name BB>], $value_kind, $value_string, DMatrix, DVector, DVector);
3868 box_mech_fxn(Ok(Box::new([<$fxn_name BB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3869 },
3870 #[cfg(all(feature = $value_string, feature = "matrix1"))]
3872 (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))) => {
3873 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix1, Matrix1, Matrix1, Matrix1);
3874 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3875 },
3876 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix1", feature = "row_vector2"))]
3877 (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))) => {
3878 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector2, RowVector2, Matrix1, Vector2);
3879 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3880 },
3881 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix1", feature = "row_vector3"))]
3882 (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))) => {
3883 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector3, RowVector3, Matrix1, Vector3);
3884 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3885 },
3886 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix1", feature = "row_vector4"))]
3887 (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))) => {
3888 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowVector4, RowVector4, Matrix1, Vector4);
3889 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3890 },
3891 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrix1", feature = "row_vectord"))]
3892 (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() => {
3893 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, RowDVector, RowDVector, Matrix1, DVector);
3894 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3895 },
3896 #[cfg(all(feature = $value_string, feature = "vector2", feature = "vector2", feature = "matrix1"))]
3897 (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))) => {
3898 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector2, Vector2, Vector2, Matrix1);
3899 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3900 },
3901 #[cfg(all(feature = $value_string, feature = "vector3", feature = "vector3", feature = "matrix1"))]
3902 (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))) => {
3903 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector3, Vector3, Vector3, Matrix1);
3904 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3905 },
3906 #[cfg(all(feature = $value_string, feature = "vector4", feature = "vector4", feature = "matrix1"))]
3907 (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))) => {
3908 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Vector4, Vector4, Vector4, Matrix1);
3909 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3910 },
3911 #[cfg(all(feature = $value_string, feature = "vectord", feature = "vectord", feature = "matrix1"))]
3912 (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() => {
3913 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DVector, DVector, DVector, Matrix1);
3914 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3915 },
3916 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
3917 (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))) => {
3918 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix2, Matrix2, Vector2, Vector2);
3919 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3920 },
3921 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
3922 (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))) => {
3923 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix3, Matrix3, Vector3, Vector3);
3924 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3925 },
3926 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
3927 (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))) => {
3928 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix4, Matrix4, Vector4, Vector4);
3929 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3930 },
3931 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector3", feature = "vector2"))]
3932 (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))) => {
3933 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix2x3, Matrix2x3, Vector2, Vector3);
3934 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3935 },
3936 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector2", feature = "vector3"))]
3937 (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))) => {
3938 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, Matrix3x2, Matrix3x2, Vector3, Vector2);
3939 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3940 },
3941 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector4", feature = "vector2"))]
3942 (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() => {
3943 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, Vector4, Vector2);
3944 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3945 },
3946 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vector2", feature = "vector4"))]
3947 (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() => {
3948 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, Vector2, Vector4);
3949 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3950 },
3951 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector2"))]
3952 (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() => {
3953 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector2);
3954 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3955 },
3956 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector3"))]
3957 (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() => {
3958 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector3);
3959 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3960 },
3961 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vector4"))]
3962 (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() => {
3963 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, Vector4);
3964 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3965 },
3966 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3967 (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() => {
3968 register_assign_srr_b2!([<$fxn_name VBB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
3969 box_mech_fxn(Ok(Box::new([<$fxn_name VBB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3970 },
3971 (source, ixes, sink) => Err(MechError::new(
3972 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3973 None
3974 ).with_compiler_loc()),
3975 }
3976 }
3977 }
3978}
3979
3980#[macro_export]
3981macro_rules! impl_assign_range_range_arms_bu {
3982 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
3983 paste! {
3984 match $arg {
3985 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3987 (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() => {
3988 register_assign_srr_bu!([<$fxn_name BU>], $value_kind, $value_string, DMatrix, DVector, DVector);
3989 box_mech_fxn(Ok(Box::new([<$fxn_name BU>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3990 },
3991 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
3993 (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() => {
3994 register_assign_srr_bu2!([<$fxn_name VBU>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
3995 box_mech_fxn(Ok(Box::new([<$fxn_name VBU>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
3996 },
3997 (source, ixes, sink) => Err(MechError::new(
3998 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
3999 None
4000 ).with_compiler_loc()),
4001 }
4002 }
4003 }
4004}
4005
4006#[macro_export]
4007macro_rules! impl_assign_range_range_arms_ub {
4008 ($fxn_name:ident, $shape:tt, $arg:expr, $value_kind:ident, $value_string:tt) => {
4009 paste! {
4010 match $arg {
4011 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
4013 (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() => {
4014 register_assign_srr_ub!([<$fxn_name UB>], $value_kind, $value_string, DMatrix, DVector, DVector);
4015 box_mech_fxn(Ok(Box::new([<$fxn_name UB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
4016 },
4017 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord", feature = "vectord"))]
4019 (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() => {
4020 register_assign_srr_ub2!([<$fxn_name VUB>], $value_kind, $value_string, DMatrix, DMatrix, DVector, DVector);
4021 box_mech_fxn(Ok(Box::new([<$fxn_name VUB>] { sink: sink.clone(), source: source.clone(), ixes: (ix1.clone(), ix2.clone()), _marker: PhantomData::default() })))
4022 },
4023 (source, ixes, sink) => Err(MechError::new(
4024 UnhandledFunctionArgumentIxes { arg: (source.kind(), ixes.to_vec().iter().map(|x| x.kind()).collect(), sink.kind()), fxn_name: stringify!($fxn_name).to_string() },
4025 None
4026 ).with_compiler_loc()),
4027 }
4028 }
4029 }
4030}