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