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 }
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");