1use crate::*;
2use mech_core::*;
3#[cfg(feature = "matrix")]
4use mech_core::matrix::Matrix;
5
6macro_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");