mech_interpreter/stdlib/math/
sub.rs1#[macro_use]
2use crate::stdlib::*;
3
4macro_rules! sub_op {
7 ($lhs:expr, $rhs:expr, $out:expr) => {
8 unsafe { *$out = *$lhs - *$rhs; }
9 };}
10
11macro_rules! sub_vec_op {
12($lhs:expr, $rhs:expr, $out:expr) => {
13 unsafe { (*$lhs).sub_to(&*$rhs,&mut *$out) }
14 };}
15
16macro_rules! sub_scalar_lhs_op {
17($lhs:expr, $rhs:expr, $out:expr) => {
18 unsafe {
19 for i in 0..(*$lhs).len() {
20 (*$out)[i] = (*$lhs)[i] - (*$rhs);
21 }}};}
22
23macro_rules! sub_scalar_rhs_op {
24($lhs:expr, $rhs:expr, $out:expr) => {
25 unsafe {
26 for i in 0..(*$rhs).len() {
27 (*$out)[i] = (*$lhs) - (*$rhs)[i];
28 }}};}
29
30macro_rules! sub_mat_vec_op {
31 ($lhs:expr, $rhs:expr, $out:expr) => {
32 unsafe {
33 let mut out_deref = &mut (*$out);
34 let lhs_deref = &(*$lhs);
35 let rhs_deref = &(*$rhs);
36 for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
37 for i in 0..col.len() {
38 col[i] = lhs_col[i] - rhs_deref[i];
39 }
40 }
41 }
42 };}
43
44macro_rules! sub_vec_mat_op {
45($lhs:expr, $rhs:expr, $out:expr) => {
46 unsafe {
47 let mut out_deref = &mut (*$out);
48 let lhs_deref = &(*$lhs);
49 let rhs_deref = &(*$rhs);
50 for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
51 for i in 0..col.len() {
52 col[i] = lhs_deref[i] - rhs_col[i];
53 }
54 }
55 }
56};}
57
58macro_rules! sub_mat_row_op {
59($lhs:expr, $rhs:expr, $out:expr) => {
60 unsafe {
61 let mut out_deref = &mut (*$out);
62 let lhs_deref = &(*$lhs);
63 let rhs_deref = &(*$rhs);
64 for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
65 for i in 0..row.len() {
66 row[i] = lhs_row[i] - rhs_deref[i];
67 }
68 }
69 }
70};}
71
72macro_rules! sub_row_mat_op {
73($lhs:expr, $rhs:expr, $out:expr) => {
74 unsafe {
75 let mut out_deref = &mut (*$out);
76 let lhs_deref = &(*$lhs);
77 let rhs_deref = &(*$rhs);
78 for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
79 for i in 0..row.len() {
80 row[i] = lhs_deref[i] - rhs_row[i];
81 }
82 }
83 }
84};}
85
86impl_math_fxns!(Sub);
87
88fn impl_sub_fxn(lhs_value: Value, rhs_value: Value) -> Result<Box<dyn MechFunction>, MechError> {
89impl_binop_match_arms!(
90 Sub,
91 (lhs_value, rhs_value),
92 I8, I8 => MatrixI8, i8, i8::zero(), "I8";
93 I16, I16 => MatrixI16, i16, i16::zero(), "I16";
94 I32, I32 => MatrixI32, i32, i32::zero(), "I32";
95 I64, I64 => MatrixI64, i64, i64::zero(), "I64";
96 I128, I128 => MatrixI128, i128, i128::zero(), "I128";
97 U8, U8 => MatrixU8, u8, u8::zero(), "U8";
98 U16, U16 => MatrixU16, u16, u16::zero(), "U16";
99 U32, U32 => MatrixU32, u32, u32::zero(), "U32";
100 U64, U64 => MatrixU64, u64, u64::zero(), "U64";
101 U128, U128 => MatrixU128, u128, u128::zero(), "U128";
102 F32, F32 => MatrixF32, F32, F32::zero(), "F32";
103 F64, F64 => MatrixF64, F64, F64::zero(), "F64";
104)
105}
106
107impl_mech_binop_fxn!(MathSub,impl_sub_fxn);