mech_stats/
sum_column.rs

1use crate::*;
2use mech_core::*;
3
4// Stats Sum Column -----------------------------------------------------------
5
6macro_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);