Skip to main content

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    }
23  };}
24
25macro_rules! and_scalar_rhs_op {
26  ($lhs:expr, $rhs:expr, $out:expr) => {
27    unsafe {
28      let lhs_deref = &(*$lhs);
29      let rhs_deref = &(*$rhs);
30      let mut out_deref = &mut (*$out);
31      for i in 0..rhs_deref.len() {
32        out_deref[i] = *lhs_deref && rhs_deref[i];
33      }
34    }
35  };}
36      
37
38macro_rules! and_scalar_lhs_op {
39  ($lhs:expr, $rhs:expr, $out:expr) => {
40    unsafe {
41      let lhs_deref = &(*$lhs);
42      let rhs_deref = &(*$rhs);
43      let mut out_deref = &mut (*$out);
44      for i in 0..lhs_deref.len() {
45        out_deref[i] = lhs_deref[i] && *rhs_deref;
46      }
47    }
48  };}
49
50macro_rules! and_mat_vec_op {
51  ($lhs:expr, $rhs:expr, $out:expr) => {
52    unsafe {
53      let mut out_deref = &mut (*$out);
54      let lhs_deref = &(*$lhs);
55      let rhs_deref = &(*$rhs);
56      for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
57        for i in 0..col.len() {
58          col[i] = lhs_col[i] && rhs_deref[i];
59        }
60      }
61    }
62  };}   
63      
64macro_rules! and_vec_mat_op {
65  ($lhs:expr, $rhs:expr, $out:expr) => {
66    unsafe {
67      let mut out_deref = &mut (*$out);
68      let lhs_deref = &(*$lhs);
69      let rhs_deref = &(*$rhs);
70      for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
71        for i in 0..col.len() {
72          col[i] = lhs_deref[i] && rhs_col[i];
73        }
74      }
75    }
76  };}
77  
78macro_rules! and_mat_row_op {
79  ($lhs:expr, $rhs:expr, $out:expr) => {
80    unsafe {
81      let mut out_deref = &mut (*$out);
82      let lhs_deref = &(*$lhs);
83      let rhs_deref = &(*$rhs);
84      for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
85          for i in 0..row.len() {
86          row[i] = lhs_row[i] && rhs_deref[i];
87          }
88      }
89    }
90  };}
91
92macro_rules! and_row_mat_op {
93  ($lhs:expr, $rhs:expr, $out:expr) => {
94    unsafe {
95      let mut out_deref = &mut (*$out);
96      let lhs_deref = &(*$lhs);
97      let rhs_deref = &(*$rhs);
98      for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
99          for i in 0..row.len() {
100          row[i] = lhs_deref[i] && rhs_row[i];
101          }
102      }
103    }
104  };} 
105        
106impl_logic_fxns!(And);
107
108fn impl_and_fxn(lhs_value: Value, rhs_value: Value) -> MResult<Box<dyn MechFunction>> {
109  impl_binop_match_arms!(
110    And,
111    register_fxn_descriptor_inner_logic,
112    (lhs_value, rhs_value),
113    Bool, bool, "bool";
114  )
115}
116  
117impl_mech_binop_fxn!(LogicAnd,impl_and_fxn,"logic/and");