mech_interpreter/stdlib/compare/
lte.rs

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