mech_interpreter/stdlib/math/
div.rs

1#[macro_use]
2use crate::stdlib::*;
3
4// Div ------------------------------------------------------------------------
5
6macro_rules! div_op {
7  ($lhs:expr, $rhs:expr, $out:expr) => {
8    unsafe { *$out = *$lhs / *$rhs; }
9  };}
10  
11macro_rules! div_vec_op {
12($lhs:expr, $rhs:expr, $out:expr) => {
13  unsafe { *$out = (*$lhs).component_div(&*$rhs); }
14  };}
15
16macro_rules! div_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! div_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
30  macro_rules! div_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! div_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! div_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! div_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!(Div);
87
88fn impl_div_fxn(lhs_value: Value, rhs_value: Value) -> Result<Box<dyn MechFunction>, MechError> {
89  impl_binop_match_arms!(
90    Div,
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!(MathDiv,impl_div_fxn);