1#[macro_use]
2use crate::*;
3use num_traits::*;
4#[cfg(feature = "matrix")]
5use mech_core::matrix::Matrix;
6
7macro_rules! mul_op {
10 ($lhs:expr, $rhs:expr, $out:expr) => {
11 unsafe { *$out = *$lhs * *$rhs; }};}
12
13macro_rules! mul_vec_op {
14 ($lhs:expr, $rhs:expr, $out:expr) => {
15 unsafe {
16 let mut out_deref = &mut (*$out);
17 let lhs_deref = &(*$lhs);
18 let rhs_deref = &(*$rhs);
19 for (o,(l,r)) in out_deref.iter_mut().zip(lhs_deref.iter().zip(rhs_deref.iter())) {
20 *o = *l * *r;
21 }
22 }};}
23
24macro_rules! mul_scalar_lhs_op {
25 ($lhs:expr, $rhs:expr, $out:expr) => {
26 unsafe {
27 let mut out_deref = &mut (*$out);
28 let lhs_deref = &(*$lhs);
29 let rhs_deref = (*$rhs);
30 for (o,l) in out_deref.iter_mut().zip(lhs_deref.iter()) {
31 *o = *l * rhs_deref;
32 }
33 }};}
34
35macro_rules! mul_scalar_rhs_op {
36 ($lhs:expr, $rhs:expr, $out:expr) => {
37 unsafe {
38 let mut out_deref = &mut (*$out);
39 let lhs_deref = (*$lhs);
40 let rhs_deref = &(*$rhs);
41 for (o,r) in out_deref.iter_mut().zip(rhs_deref.iter()) {
42 *o = lhs_deref * *r;
43 }
44 }};}
45
46macro_rules! mul_mat_vec_op {
47 ($lhs:expr, $rhs:expr, $out:expr) => {
48 unsafe {
49 let mut out_deref = &mut (*$out);
50 let lhs_deref = &(*$lhs);
51 let rhs_deref = &(*$rhs);
52 for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
53 for i in 0..col.len() {
54 col[i] = lhs_col[i] * rhs_deref[i];
55 }
56 }
57 }
58 };}
59
60macro_rules! mul_vec_mat_op {
61 ($lhs:expr, $rhs:expr, $out:expr) => {
62 unsafe {
63 let mut out_deref = &mut (*$out);
64 let lhs_deref = &(*$lhs);
65 let rhs_deref = &(*$rhs);
66 for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
67 for i in 0..col.len() {
68 col[i] = lhs_deref[i] * rhs_col[i];
69 }
70 }
71 }
72 };}
73
74macro_rules! mul_mat_row_op {
75 ($lhs:expr, $rhs:expr, $out:expr) => {
76 unsafe {
77 let mut out_deref = &mut (*$out);
78 let lhs_deref = &(*$lhs);
79 let rhs_deref = &(*$rhs);
80 for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
81 for i in 0..row.len() {
82 row[i] = lhs_row[i] * rhs_deref[i];
83 }
84 }
85 }
86 };}
87
88macro_rules! mul_row_mat_op {
89 ($lhs:expr, $rhs:expr, $out:expr) => {
90 unsafe {
91 let mut out_deref = &mut (*$out);
92 let lhs_deref = &(*$lhs);
93 let rhs_deref = &(*$rhs);
94 for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
95 for i in 0..row.len() {
96 row[i] = lhs_deref[i] * rhs_row[i];
97 }
98 }
99 }
100 };}
101
102impl_math_fxns!(Mul);
103
104fn impl_mul_fxn(lhs_value: Value, rhs_value: Value) -> MResult<Box<dyn MechFunction>> {
105 impl_binop_match_arms!(
106 Mul,
107 register_fxn_descriptor_inner,
108 (lhs_value, rhs_value),
109 I8, i8, "i8";
110 I16, i16, "i16";
111 I32, i32, "i32";
112 I64, i64, "i64";
113 I128, i128, "i128";
114 U8, u8, "u8";
115 U16, u16, "u16";
116 U32, u32, "u32";
117 U64, u64, "u64";
118 U128, u128, "u128";
119 F32, f32, "f32";
120 F64, f64, "f64";
121 R64, R64, "rational";
122 C64, C64, "complex";
123 )
124}
125
126impl_mech_binop_fxn!(MathMul,impl_mul_fxn,"math/mul");