mech_interpreter/stdlib/compare/
eq.rs

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