mech_interpreter/stdlib/math/
sub.rs

1#[macro_use]
2use crate::stdlib::*;
3
4// Sub ------------------------------------------------------------------------
5
6macro_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);