1use crate::*;
2use mech_core::*;
3
4macro_rules! sum_column_op {
7 ($arg:expr, $out:expr) => {
8 unsafe {
9 *$out = (*$arg).column_sum();
10 }
11 };}
12
13 #[cfg(feature = "Matrix1")]
14 impl_stats_urop!(StatsSumColumnM1, Matrix1<T>, Matrix1<T>, sum_column_op);
15 #[cfg(feature = "Matrix2")]
16 impl_stats_urop!(StatsSumColumnM2, Matrix2<T>, Vector2<T>, sum_column_op);
17 #[cfg(feature = "Matrix3")]
18 impl_stats_urop!(StatsSumColumnM3, Matrix3<T>, Vector3<T>, sum_column_op);
19 #[cfg(feature = "Matrix4")]
20 impl_stats_urop!(StatsSumColumnM4, Matrix4<T>, Vector4<T>, sum_column_op);
21 #[cfg(feature = "Matrix2x3")]
22 impl_stats_urop!(StatsSumColumnM2x3, Matrix2x3<T>, Vector2<T>, sum_column_op);
23 #[cfg(feature = "Matrix3x2")]
24 impl_stats_urop!(StatsSumColumnM3x2, Matrix3x2<T>, Vector3<T>, sum_column_op);
25 #[cfg(feature = "MatrixD")]
26 impl_stats_urop!(StatsSumColumnMD, DMatrix<T>, DVector<T>, sum_column_op);
27 #[cfg(feature = "Vector2")]
28 impl_stats_urop!(StatsSumColumnV2, Vector2<T>, Vector2<T>, sum_column_op);
29 #[cfg(feature = "Vector3")]
30 impl_stats_urop!(StatsSumColumnV3, Vector3<T>, Vector3<T>, sum_column_op);
31 #[cfg(feature = "Vector4")]
32 impl_stats_urop!(StatsSumColumnV4, Vector4<T>, Vector4<T>, sum_column_op);
33 #[cfg(feature = "VectorD")]
34 impl_stats_urop!(StatsSumColumnVD, DVector<T>, DVector<T>, sum_column_op);
35 #[cfg(feature = "Vector2")]
36 impl_stats_urop!(StatsSumColumnR2, RowVector2<T>, Matrix1<T>, sum_column_op);
37 #[cfg(feature = "Vector3")]
38 impl_stats_urop!(StatsSumColumnR3, RowVector3<T>, Matrix1<T>, sum_column_op);
39 #[cfg(feature = "Vector4")]
40 impl_stats_urop!(StatsSumColumnR4, RowVector4<T>, Matrix1<T>, sum_column_op);
41 #[cfg(feature = "VectorD")]
42 impl_stats_urop!(StatsSumColumnRD, RowDVector<T>, Matrix1<T>, sum_column_op);
43
44 macro_rules! impl_stats_sum_column_match_arms {
45 ($arg:expr, $($input_type:ident => $($matrix_kind:ident, $target_type:ident, $default:expr, $value_string:tt),+);+ $(;)?) => {
46 match $arg {
47 $(
48 $(
49 #[cfg(feature = "Vector4")]
50 Value::$matrix_kind(Matrix::<$target_type>::RowVector4(arg)) => Ok(Box::new(StatsSumColumnR4{arg: arg.clone(), out: new_ref(Matrix1::from_element($default)) })),
51 #[cfg(feature = "Vector3")]
52 Value::$matrix_kind(Matrix::<$target_type>::RowVector3(arg)) => Ok(Box::new(StatsSumColumnR3{arg: arg.clone(), out: new_ref(Matrix1::from_element($default)) })),
53 #[cfg(feature = "Vector2")]
54 Value::$matrix_kind(Matrix::<$target_type>::RowVector2(arg)) => Ok(Box::new(StatsSumColumnR2{arg: arg.clone(), out: new_ref(Matrix1::from_element($default)) })),
55 #[cfg(feature = "Vector4")]
56 Value::$matrix_kind(Matrix::<$target_type>::Vector4(arg)) => Ok(Box::new(StatsSumColumnV4{arg: arg.clone(), out: new_ref(Vector4::from_element($default)) })),
57 #[cfg(feature = "Vector3")]
58 Value::$matrix_kind(Matrix::<$target_type>::Vector3(arg)) => Ok(Box::new(StatsSumColumnV3{arg: arg.clone(), out: new_ref(Vector3::from_element($default)) })),
59 #[cfg(feature = "Vector2")]
60 Value::$matrix_kind(Matrix::<$target_type>::Vector2(arg)) => Ok(Box::new(StatsSumColumnV2{arg: arg.clone(), out: new_ref(Vector2::from_element($default)) })),
61 #[cfg(feature = "Matrix4")]
62 Value::$matrix_kind(Matrix::<$target_type>::Matrix4(arg)) => Ok(Box::new(StatsSumColumnM4{arg: arg.clone(), out: new_ref(Vector4::from_element($default))})),
63 #[cfg(feature = "Matrix3")]
64 Value::$matrix_kind(Matrix::<$target_type>::Matrix3(arg)) => Ok(Box::new(StatsSumColumnM3{arg: arg.clone(), out: new_ref(Vector3::from_element($default))})),
65 #[cfg(feature = "Matrix2")]
66 Value::$matrix_kind(Matrix::<$target_type>::Matrix2(arg)) => Ok(Box::new(StatsSumColumnM2{arg: arg.clone(), out: new_ref(Vector2::from_element($default))})),
67 #[cfg(feature = "Matrix1")]
68 Value::$matrix_kind(Matrix::<$target_type>::Matrix1(arg)) => Ok(Box::new(StatsSumColumnM1{arg: arg.clone(), out: new_ref(Matrix1::from_element($default))})),
69 #[cfg(feature = "Matrix2x3")]
70 Value::$matrix_kind(Matrix::<$target_type>::Matrix2x3(arg)) => Ok(Box::new(StatsSumColumnM2x3{arg: arg.clone(), out: new_ref(Vector2::from_element($default))})),
71 #[cfg(feature = "Matrix3x2")]
72 Value::$matrix_kind(Matrix::<$target_type>::Matrix3x2(arg)) => Ok(Box::new(StatsSumColumnM3x2{arg: arg.clone(), out: new_ref(Vector3::from_element($default))})),
73 #[cfg(feature = "VectorD")]
74 Value::$matrix_kind(Matrix::<$target_type>::DVector(arg)) => Ok(Box::new(StatsSumColumnVD{arg: arg.clone(), out: new_ref(DVector::from_element(arg.borrow().len(),$default))})),
75 #[cfg(feature = "VectorD")]
76 Value::$matrix_kind(Matrix::<$target_type>::RowDVector(arg)) => Ok(Box::new(StatsSumColumnRD{arg: arg.clone(), out: new_ref(Matrix1::from_element($default))})),
77 #[cfg(feature = "MatrixD")]
78 Value::$matrix_kind(Matrix::<$target_type>::DMatrix(arg)) => Ok(Box::new(StatsSumColumnMD{arg: arg.clone(), out: new_ref(DVector::from_element(arg.borrow().nrows(),$default))})),
79 )+
80 )+
81 _ => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
82 }
83 }
84 }
85
86 fn impl_stats_sum_column_fxn(lhs_value: Value) -> Result<Box<dyn MechFunction>, MechError> {
87 impl_stats_sum_column_match_arms!(
88 lhs_value,
89 I8 => MatrixI8, i8, i8::zero(), "I8";
90 I16 => MatrixI16, i16, i16::zero(), "I16";
91 I32 => MatrixI32, i32, i32::zero(), "I32";
92 I64 => MatrixI64, i64, i64::zero(), "I64";
93 I128 => MatrixI128, i128, i128::zero(), "I128";
94 U8 => MatrixU8, u8, u8::zero(), "U8";
95 U16 => MatrixU16, u16, u16::zero(), "U16";
96 U32 => MatrixU32, u32, u32::zero(), "U32";
97 U64 => MatrixU64, u64, u64::zero(), "U64";
98 U128 => MatrixU128, u128, u128::zero(), "U128";
99 F32 => MatrixF32, F32, F32::zero(), "F32";
100 F64 => MatrixF64, F64, F64::zero(), "F64";
101 )
102 }
103
104 impl_mech_urnop_fxn!(StatsSumColumn,impl_stats_sum_column_fxn);