mech_string/
concat.rs

1use crate::*;
2use mech_core::*;
3#[cfg(feature = "matrix")]
4use mech_core::matrix::Matrix;
5
6// Greater Than ---------------------------------------------------------------
7
8macro_rules! concat_scalar_lhs_op {
9  ($lhs:expr, $rhs:expr, $out:expr) => {
10    unsafe {
11      for i in 0..(*$lhs).len() {
12        (&mut (*$out))[i] = (&(*$lhs))[i].concat(&(*$rhs));
13      }}};}
14
15macro_rules! concat_scalar_rhs_op {
16  ($lhs:expr, $rhs:expr, $out:expr) => {
17    unsafe {
18      for i in 0..(*$rhs).len() {
19        (&mut (*$out))[i] = (*$lhs).concat(&(&(*$rhs))[i]);
20      }}};}
21
22macro_rules! concat_vec_op {
23  ($lhs:expr, $rhs:expr, $out:expr) => {
24    unsafe {
25      for i in 0..(*$lhs).len() {
26        (&mut (*$out))[i] = (&(*$lhs))[i].concat(&(&(*$rhs))[i]);
27      }}};}
28
29macro_rules! concat_op {
30  ($lhs:expr, $rhs:expr, $out:expr) => {
31    unsafe {
32      (*$out) = (*$lhs).concat(&(*$rhs));
33    }};}
34
35macro_rules! concat_mat_vec_op {
36  ($lhs:expr, $rhs:expr, $out:expr) => {
37    unsafe {
38      let mut out_deref = &mut (*$out);
39      let lhs_deref = &(*$lhs);
40      let rhs_deref = &(*$rhs);
41      for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
42        for i in 0..col.len() {
43          col[i] = lhs_col[i].concat(&rhs_deref[i]);
44        }
45      }
46    }
47  };}   
48      
49macro_rules! concat_vec_mat_op {
50  ($lhs:expr, $rhs:expr, $out:expr) => {
51      unsafe {
52        let mut out_deref = &mut (*$out);
53        let lhs_deref = &(*$lhs);
54        let rhs_deref = &(*$rhs);
55        for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
56          for i in 0..col.len() {
57            col[i] = lhs_deref[i].concat(&rhs_col[i]);
58          }
59        }
60      }
61  };}
62  
63macro_rules! concat_mat_row_op {
64  ($lhs:expr, $rhs:expr, $out:expr) => {
65      unsafe {
66      let mut out_deref = &mut (*$out);
67      let lhs_deref = &(*$lhs);
68      let rhs_deref = &(*$rhs);
69      for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
70          for i in 0..row.len() {
71          row[i] = lhs_row[i].concat(&rhs_deref[i]);
72          }
73      }
74      }
75  };}
76
77macro_rules! concat_row_mat_op {
78  ($lhs:expr, $rhs:expr, $out:expr) => {
79      unsafe {
80      let mut out_deref = &mut (*$out);
81      let lhs_deref = &(*$lhs);
82      let rhs_deref = &(*$rhs);
83      for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
84        for i in 0..row.len() {
85          row[i] = lhs_deref[i].concat(&rhs_row[i]);
86        }
87      }
88      }
89  };}    
90
91impl_string_fxns!(Concat);
92
93fn impl_concat_fxn(lhs_value: Value, rhs_value: Value) -> MResult<Box<dyn MechFunction>> {
94  impl_binop_match_arms!(
95    Concat,
96    register_fxn_descriptor_inner,
97    (lhs_value, rhs_value),
98    String, String, "string";
99  )
100}
101
102impl_mech_binop_fxn!(StringConcat,impl_concat_fxn,"string/concat");