mech_logic/
and.rs

1use crate::*;
2use mech_core::*;
3#[cfg(feature = "matrix")]
4use mech_core::matrix::Matrix;
5
6// And ------------------------------------------------------------------------
7
8macro_rules! and_op {
9    ($lhs:expr, $rhs:expr, $out:expr) => {
10      unsafe {*$out = *$lhs && *$rhs;}
11      };}
12  
13macro_rules! and_vec_op {
14  ($lhs:expr, $rhs:expr, $out:expr) => {
15    unsafe {
16      let lhs_deref = &(*$lhs);
17      let rhs_deref = &(*$rhs);
18      let mut out_deref = &mut (*$out);
19      for i in 0..lhs_deref.len() {
20        out_deref[i] = lhs_deref[i] && rhs_deref[i];
21      }}};}
22    
23macro_rules! and_scalar_rhs_op {
24  ($lhs:expr, $rhs:expr, $out:expr) => {
25    unsafe {
26      let lhs_deref = &(*$lhs);
27      let rhs_deref = &(*$rhs);
28      let mut out_deref = &mut (*$out);
29      for i in 0..rhs_deref.len() {
30        out_deref[i] = *lhs_deref && rhs_deref[i];
31      }}};}
32      
33
34macro_rules! and_scalar_lhs_op {
35  ($lhs:expr, $rhs:expr, $out:expr) => {
36    unsafe {
37      let lhs_deref = &(*$lhs);
38      let rhs_deref = &(*$rhs);
39      let mut out_deref = &mut (*$out);
40      for i in 0..lhs_deref.len() {
41        out_deref[i] = lhs_deref[i] && *rhs_deref;
42      }}};}
43
44macro_rules! and_mat_vec_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, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
51        for i in 0..col.len() {
52          col[i] = lhs_col[i] && rhs_deref[i];
53        }
54      }
55    }
56  };}   
57      
58macro_rules! and_vec_mat_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 col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
65          for i in 0..col.len() {
66            col[i] = lhs_deref[i] && rhs_col[i];
67          }
68        }
69      }
70  };}
71  
72macro_rules! and_mat_row_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, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
79          for i in 0..row.len() {
80          row[i] = lhs_row[i] && rhs_deref[i];
81          }
82      }
83      }
84  };}
85
86macro_rules! and_row_mat_op {
87  ($lhs:expr, $rhs:expr, $out:expr) => {
88      unsafe {
89      let mut out_deref = &mut (*$out);
90      let lhs_deref = &(*$lhs);
91      let rhs_deref = &(*$rhs);
92      for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
93          for i in 0..row.len() {
94          row[i] = lhs_deref[i] && rhs_row[i];
95          }
96      }
97      }
98  };} 
99        
100  impl_logic_fxns!(And);
101  
102  fn impl_and_fxn(lhs_value: Value, rhs_value: Value) -> MResult<Box<dyn MechFunction>> {
103    impl_binop_match_arms!(
104      And,
105      register_fxn_descriptor_inner_logic,
106      (lhs_value, rhs_value),
107      Bool, bool, "bool";
108    )
109  }
110  
111  impl_mech_binop_fxn!(LogicAnd,impl_and_fxn,"logic/and");