1#[macro_use]
2use crate::stdlib::*;
3
4macro_rules! impl_set_match_arms {
7 ($fxn_name:ident,$macro_name:ident, $arg:expr) => {
8 paste!{
9 [<impl_set_ $macro_name _match_arms>]!(
10 $fxn_name,
11 $arg,
12 Bool, "Bool";
13 U8, "U8";
14 U16, "U16";
15 U32, "U32";
16 U64, "U64";
17 U128, "U128";
18 I8, "I8";
19 I16, "I16";
20 I32, "I32";
21 I64, "I64";
22 U128, "U128";
23 F32, "F32";
24 F64, "F64" ;
25 )
26 }
27 }
28}
29
30macro_rules! set_1d_set_scalar {
33 ($sink:expr, $ix:expr, $source:expr) => {
34 ($sink)[$ix - 1] = ($source).clone();
35 };}
36
37macro_rules! set_1d_set_scalar_b {
38 ($sink:expr, $ix:expr, $source:expr) => {
39 if $ix {
40 for iy in 0..$sink.len() {
41 ($sink)[iy] = ($source).clone();
42 }
43 }
44 };}
45
46macro_rules! impl_set_scalar_fxn {
47 ($struct_name:ident, $matrix_shape:ident, $op:tt, $ix:ty) => {
48 #[derive(Debug)]
49 struct $struct_name<T> {
50 source: Ref<T>,
51 ixes: Ref<$ix>,
52 sink: Ref<$matrix_shape<T>>,
53 }
54 impl<T> MechFunction for $struct_name<T>
55 where
56 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
57 Ref<$matrix_shape<T>>: ToValue
58 {
59 fn solve(&self) {
60 unsafe {
61 let ix_ptr = (*(self.ixes.as_ptr())).clone();
62 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
63 let source_ptr = (*(self.source.as_ptr())).clone();
64 $op!(sink_ptr,ix_ptr,source_ptr);
65 }
66 }
67 fn out(&self) -> Value { self.sink.to_value() }
68 fn to_string(&self) -> String { format!("{:#?}", self) }
69 }};}
70
71#[cfg(feature = "RowVector4")]
72impl_set_scalar_fxn!(Set1DSR4,RowVector4, set_1d_set_scalar, usize);
73#[cfg(feature = "RowVector3")]
74impl_set_scalar_fxn!(Set1DSR3,RowVector3, set_1d_set_scalar, usize);
75#[cfg(feature = "RowVector2")]
76impl_set_scalar_fxn!(Set1DSR2,RowVector2, set_1d_set_scalar, usize);
77#[cfg(feature = "RowVectorD")]
78impl_set_scalar_fxn!(Set1DSRD,RowDVector, set_1d_set_scalar, usize);
79#[cfg(feature = "Vector4")]
80impl_set_scalar_fxn!(Set1DSV4,Vector4, set_1d_set_scalar, usize);
81#[cfg(feature = "Vector3")]
82impl_set_scalar_fxn!(Set1DSV3,Vector3, set_1d_set_scalar, usize);
83#[cfg(feature = "Vector2")]
84impl_set_scalar_fxn!(Set1DSV2,Vector2, set_1d_set_scalar, usize);
85#[cfg(feature = "VectorD")]
86impl_set_scalar_fxn!(Set1DSVD,DVector, set_1d_set_scalar, usize);
87#[cfg(feature = "MAtrix4")]
88impl_set_scalar_fxn!(Set1DSM4,Matrix4, set_1d_set_scalar, usize);
89#[cfg(feature = "Matrix3")]
90impl_set_scalar_fxn!(Set1DSM3,Matrix3, set_1d_set_scalar, usize);
91#[cfg(feature = "Matrix2")]
92impl_set_scalar_fxn!(Set1DSM2,Matrix2, set_1d_set_scalar, usize);
93#[cfg(feature = "MAtrix1")]
94impl_set_scalar_fxn!(Set1DSM1,Matrix1, set_1d_set_scalar, usize);
95#[cfg(feature = "Matrix2x3")]
96impl_set_scalar_fxn!(Set1DSM2x3,Matrix2x3, set_1d_set_scalar, usize);
97#[cfg(feature = "Matrix3x2")]
98impl_set_scalar_fxn!(Set1DSM3x2,Matrix3x2, set_1d_set_scalar, usize);
99#[cfg(feature = "MatrixD")]
100impl_set_scalar_fxn!(Set1DSMD,DMatrix, set_1d_set_scalar, usize);
101
102#[cfg(feature = "RowVector4")]
103impl_set_scalar_fxn!(Set1DSR4B,RowVector4, set_1d_set_scalar_b, bool);
104#[cfg(feature = "RowVector3")]
105impl_set_scalar_fxn!(Set1DSR3B,RowVector3, set_1d_set_scalar_b, bool);
106#[cfg(feature = "RowVector2")]
107impl_set_scalar_fxn!(Set1DSR2B,RowVector2, set_1d_set_scalar_b, bool);
108#[cfg(feature = "RowVectorD")]
109impl_set_scalar_fxn!(Set1DSRDB,RowDVector, set_1d_set_scalar_b, bool);
110#[cfg(feature = "Vector4")]
111impl_set_scalar_fxn!(Set1DSV4B,Vector4, set_1d_set_scalar_b, bool);
112#[cfg(feature = "Vector3")]
113impl_set_scalar_fxn!(Set1DSV3B,Vector3, set_1d_set_scalar_b, bool);
114#[cfg(feature = "Vector2")]
115impl_set_scalar_fxn!(Set1DSV2B,Vector2, set_1d_set_scalar_b, bool);
116#[cfg(feature = "VectorD")]
117impl_set_scalar_fxn!(Set1DSVDB,DVector, set_1d_set_scalar_b, bool);
118#[cfg(feature = "MAtrix4")]
119impl_set_scalar_fxn!(Set1DSM4B,Matrix4, set_1d_set_scalar_b, bool);
120#[cfg(feature = "Matrix3")]
121impl_set_scalar_fxn!(Set1DSM3B,Matrix3, set_1d_set_scalar_b, bool);
122#[cfg(feature = "Matrix2")]
123impl_set_scalar_fxn!(Set1DSM2B,Matrix2, set_1d_set_scalar_b, bool);
124#[cfg(feature = "MAtrix1")]
125impl_set_scalar_fxn!(Set1DSM1B,Matrix1, set_1d_set_scalar_b, bool);
126#[cfg(feature = "Matrix2x3")]
127impl_set_scalar_fxn!(Set1DSM2x3B,Matrix2x3, set_1d_set_scalar_b, bool);
128#[cfg(feature = "Matrix3x2")]
129impl_set_scalar_fxn!(Set1DSM3x2B,Matrix3x2, set_1d_set_scalar_b, bool);
130#[cfg(feature = "MatrixD")]
131impl_set_scalar_fxn!(Set1DSMDB,DMatrix, set_1d_set_scalar_b, bool);
132
133macro_rules! impl_set_scalar_match_arms {
134 ($fxn_name:ident, $arg:expr, $($value_kind:ident,$value_string:tt);+ $(;)?) => {
135 paste!{
136 match $arg {
137 $(
138 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
139 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
140 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
141 (Value::[<Matrix $value_kind>](Matrix::RowVector3(sink)),[Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
142 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
143 (Value::[<Matrix $value_kind>](Matrix::RowVector2(sink)),[Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
144 #[cfg(all(feature = $value_string, feature = "Vector4"))]
145 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
146 #[cfg(all(feature = $value_string, feature = "Vector3"))]
147 (Value::[<Matrix $value_kind>](Matrix::Vector3(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
148 #[cfg(all(feature = $value_string, feature = "Vector2"))]
149 (Value::[<Matrix $value_kind>](Matrix::Vector2(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
150 #[cfg(all(feature = $value_string, feature = "MAtrix4"))]
151 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
152 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
153 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
154 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
155 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
156 #[cfg(all(feature = $value_string, feature = "MAtrix1"))]
157 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
158 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
159 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
160 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
161 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
162 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
163 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
164 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
165 (Value::[<Matrix $value_kind>](Matrix::RowDVector(sink)),[Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name RD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
166 #[cfg(all(feature = $value_string, feature = "VectorD"))]
167 (Value::[<Matrix $value_kind>](Matrix::DVector(sink)), [Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name VD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
168
169 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
170 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
171 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
172 (Value::[<Matrix $value_kind>](Matrix::RowVector3(sink)),[Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
173 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
174 (Value::[<Matrix $value_kind>](Matrix::RowVector2(sink)),[Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
175 #[cfg(all(feature = $value_string, feature = "Vector4"))]
176 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
177 #[cfg(all(feature = $value_string, feature = "Vector3"))]
178 (Value::[<Matrix $value_kind>](Matrix::Vector3(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
179 #[cfg(all(feature = $value_string, feature = "Vector2"))]
180 (Value::[<Matrix $value_kind>](Matrix::Vector2(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
181 #[cfg(all(feature = $value_string, feature = "MAtrix4"))]
182 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
183 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
184 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
185 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
186 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
187 #[cfg(all(feature = $value_string, feature = "MAtrix1"))]
188 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
189 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
190 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
191 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
192 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
193 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
194 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
195 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
196 (Value::[<Matrix $value_kind>](Matrix::RowDVector(sink)),[Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name RDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
197 #[cfg(all(feature = $value_string, feature = "VectorD"))]
198 (Value::[<Matrix $value_kind>](Matrix::DVector(sink)), [Value::Bool(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name VDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
199
200 )+
201 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
202 }
203 }
204 }
205}
206
207fn impl_set_scalar_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
208 impl_set_match_arms!(Set1DS, scalar, (sink, ixes.as_slice(), source))
209}
210
211pub struct MatrixSetScalar {}
212impl NativeFunctionCompiler for MatrixSetScalar {
213 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
214 if arguments.len() <= 1 {
215 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
216 }
217 let sink: Value = arguments[0].clone();
218 let source: Value = arguments[1].clone();
219 let ixes = arguments.clone().split_off(2);
220 match impl_set_scalar_fxn(sink.clone(),source.clone(),ixes.clone()) {
221 Ok(fxn) => Ok(fxn),
222 Err(x) => {
223 match sink {
224 Value::MutableReference(sink) => { impl_set_scalar_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
225 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
226 }
227 }
228 }
229 }
230}
231
232macro_rules! set_1d_range {
235 ($source:expr, $ix:expr, $sink:expr) => {
236 unsafe {
237 for i in 0..($ix).len() {
238 ($sink)[($ix)[i] - 1] = ($source).clone();
239 }
240 }
241 };}
242
243macro_rules! set_1d_range_b {
244 ($source:expr, $ix:expr, $sink:expr) => {
245 unsafe {
246 for i in 0..($ix).len() {
247 if $ix[i] == true {
248 ($sink)[i] = ($source).clone();
249 }
250 }
251 }
252 };}
253
254macro_rules! set_1d_range_vec {
255 ($source:expr, $ix:expr, $sink:expr) => {
256 unsafe {
257 for i in 0..($ix).len() {
258 ($sink)[($ix)[i] - 1] = ($source)[i].clone();
259 }
260 }
261 };}
262
263#[macro_export]
264macro_rules! impl_set_fxn {
265 ($struct_name:ident, $matrix_shape:ident, $source_matrix_shape:ty, $op:ident, $ix:ty) => {
266 #[derive(Debug)]
267 struct $struct_name<T> {
268 source: Ref<$source_matrix_shape>,
269 ixes: Ref<DVector<$ix>>,
270 sink: Ref<$matrix_shape<T>>,
271 }
272 impl<T> MechFunction for $struct_name<T>
273 where
274 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
275 Ref<$matrix_shape<T>>: ToValue
276 {
277 fn solve(&self) {
278 unsafe {
279 let ix_ptr = (*(self.ixes.as_ptr())).clone();
280 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
281 let source_ptr = (*(self.source.as_ptr())).clone();
282 $op!(source_ptr,ix_ptr,sink_ptr);
283 }
284 }
285 fn out(&self) -> Value { self.sink.to_value() }
286 fn to_string(&self) -> String { format!("{:#?}", self) }
287 }};}
288
289impl_set_fxn!(Set1DRRD,RowDVector,T,set_1d_range,usize);
290impl_set_fxn!(Set1DRVD,DVector,T,set_1d_range,usize);
291impl_set_fxn!(Set1DRMD,DMatrix,T,set_1d_range,usize);
292impl_set_fxn!(Set1DRR4,RowVector4,T,set_1d_range,usize);
293impl_set_fxn!(Set1DRR3,RowVector3,T,set_1d_range,usize);
294impl_set_fxn!(Set1DRR2,RowVector2,T,set_1d_range,usize);
295impl_set_fxn!(Set1DRV4,Vector4,T,set_1d_range,usize);
296impl_set_fxn!(Set1DRV3,Vector3,T,set_1d_range,usize);
297impl_set_fxn!(Set1DRV2,Vector2,T,set_1d_range,usize);
298impl_set_fxn!(Set1DRM4,Matrix4,T,set_1d_range,usize);
299impl_set_fxn!(Set1DRM3,Matrix3,T,set_1d_range,usize);
300impl_set_fxn!(Set1DRM2,Matrix2,T,set_1d_range,usize);
301impl_set_fxn!(Set1DRM1,Matrix1,T,set_1d_range,usize);
302impl_set_fxn!(Set1DRM2x3,Matrix2x3,T,set_1d_range,usize);
303impl_set_fxn!(Set1DRM3x2,Matrix3x2,T,set_1d_range,usize);
304
305impl_set_fxn!(Set1DRRDB,RowDVector,T,set_1d_range_b,bool);
306impl_set_fxn!(Set1DRVDB,DVector,T,set_1d_range_b,bool);
307impl_set_fxn!(Set1DRMDB,DMatrix,T,set_1d_range_b,bool);
308impl_set_fxn!(Set1DRR4B,RowVector4,T,set_1d_range_b,bool);
309impl_set_fxn!(Set1DRR3B,RowVector3,T,set_1d_range_b,bool);
310impl_set_fxn!(Set1DRR2B,RowVector2,T,set_1d_range_b,bool);
311impl_set_fxn!(Set1DRV4B,Vector4,T,set_1d_range_b,bool);
312impl_set_fxn!(Set1DRV3B,Vector3,T,set_1d_range_b,bool);
313impl_set_fxn!(Set1DRV2B,Vector2,T,set_1d_range_b,bool);
314impl_set_fxn!(Set1DRM4B,Matrix4,T,set_1d_range_b,bool);
315impl_set_fxn!(Set1DRM3B,Matrix3,T,set_1d_range_b,bool);
316impl_set_fxn!(Set1DRM2B,Matrix2,T,set_1d_range_b,bool);
317impl_set_fxn!(Set1DRM1B,Matrix1,T,set_1d_range_b,bool);
318impl_set_fxn!(Set1DRM2x3B,Matrix2x3,T,set_1d_range_b,bool);
319impl_set_fxn!(Set1DRM3x2B,Matrix3x2,T,set_1d_range_b,bool);
320
321impl_set_fxn!(Set1DRR4R4,RowVector4,RowVector4<T>,set_1d_range_vec,usize);
322impl_set_fxn!(Set1DRR4R3,RowVector4,RowVector3<T>,set_1d_range_vec,usize);
323impl_set_fxn!(Set1DRR4R2,RowVector4,RowVector2<T>,set_1d_range_vec,usize);
324impl_set_fxn!(Set1DRV4V4,Vector4,Vector4<T>,set_1d_range_vec,usize);
325impl_set_fxn!(Set1DRV4V3,Vector4,Vector3<T>,set_1d_range_vec,usize);
326impl_set_fxn!(Set1DRV4V2,Vector4,Vector2<T>,set_1d_range_vec,usize);
327
328impl_set_fxn!(Set1DRMDMD,DMatrix,DMatrix<T>,set_1d_range_vec,usize);
329
330#[macro_export]
331macro_rules! impl_set_range_match_arms {
332 ($fxn_name:ident, $arg:expr, $($value_kind:ident,$value_string:tt);+ $(;)?) => {
333 paste!{
334 match $arg {
335 $(
336 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
338 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::RowVector4(source))) => Ok(Box::new([<$fxn_name R4R4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
339 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
340 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::RowVector3(source))) => Ok(Box::new([<$fxn_name R4R3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
341 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
342 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::RowVector2(source))) => Ok(Box::new([<$fxn_name R4R2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
343 #[cfg(all(feature = $value_string, feature = "Vector4"))]
344 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::Vector4(source))) => Ok(Box::new([<$fxn_name V4V4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
345 #[cfg(all(feature = $value_string, feature = "Vector4"))]
346 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::Vector3(source))) => Ok(Box::new([<$fxn_name V4V3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
347 #[cfg(all(feature = $value_string, feature = "Vector4"))]
348 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::Vector2(source))) => Ok(Box::new([<$fxn_name V4V2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
349
350 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
352 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) => Ok(Box::new([<$fxn_name MDMD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
353
354 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
356 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
357 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
358 (Value::[<Matrix $value_kind>](Matrix::RowVector3(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
359 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
360 (Value::[<Matrix $value_kind>](Matrix::RowVector2(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
361 #[cfg(all(feature = $value_string, feature = "Vector4"))]
362 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
363 #[cfg(all(feature = $value_string, feature = "Vector3"))]
364 (Value::[<Matrix $value_kind>](Matrix::Vector3(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
365 #[cfg(all(feature = $value_string, feature = "Vector2"))]
366 (Value::[<Matrix $value_kind>](Matrix::Vector2(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
367 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
368 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
369 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
370 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
371 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
372 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
373 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
374 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
375 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
376 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
377 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
378 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
379 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
380 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
381 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
382 (Value::[<Matrix $value_kind>](Matrix::RowDVector(sink)),[Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name RD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
383 #[cfg(all(feature = $value_string, feature = "VectorD"))]
384 (Value::[<Matrix $value_kind>](Matrix::DVector(sink)), [Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name VD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
385
386 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
388 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
389 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
390 (Value::[<Matrix $value_kind>](Matrix::RowVector3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
391 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
392 (Value::[<Matrix $value_kind>](Matrix::RowVector2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
393 #[cfg(all(feature = $value_string, feature = "Vector4"))]
394 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
395 #[cfg(all(feature = $value_string, feature = "Vector3"))]
396 (Value::[<Matrix $value_kind>](Matrix::Vector3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
397 #[cfg(all(feature = $value_string, feature = "Vector2"))]
398 (Value::[<Matrix $value_kind>](Matrix::Vector2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
399 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
400 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
401 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
402 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
403 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
404 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
405 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
406 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
407 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
408 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
409 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
410 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
411 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
412 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
413 #[cfg(all(feature = $value_string, feature = "DVector"))]
414 (Value::[<Matrix $value_kind>](Matrix::DVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name VDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
415 #[cfg(all(feature = $value_string, feature = "RowDVector"))]
416 (Value::[<Matrix $value_kind>](Matrix::RowDVector(sink)),[Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name RDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
417 )+
418 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
419 }
420 }
421 }
422}
423
424fn impl_set_range_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
425 impl_set_match_arms!(Set1DR, range, (sink, ixes.as_slice(), source))
426}
427
428pub struct MatrixSetRange {}
429impl NativeFunctionCompiler for MatrixSetRange {
430 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
431 if arguments.len() <= 1 {
432 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
433 }
434 let sink: Value = arguments[0].clone();
435 let source: Value = arguments[1].clone();
436 let ixes = arguments.clone().split_off(2);
437 match impl_set_range_fxn(sink.clone(),source.clone(),ixes.clone()) {
438 Ok(fxn) => Ok(fxn),
439 Err(x) => {
440 match (sink,source) {
441 (Value::MutableReference(sink),Value::MutableReference(source)) => { impl_set_range_fxn(sink.borrow().clone(),source.borrow().clone(),ixes.clone()) },
442 (sink,Value::MutableReference(source)) => { impl_set_range_fxn(sink.clone(),source.borrow().clone(),ixes.clone()) },
443 (Value::MutableReference(sink),source) => { impl_set_range_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) },
444 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
445 }
446 }
447 }
448 }
449}
450
451macro_rules! impl_set_all_fxn {
454 ($struct_name:ident, $matrix_shape:ident) => {
455 #[derive(Debug)]
456 struct $struct_name<T> {
457 source: Ref<T>,
458 sink: Ref<$matrix_shape<T>>,
459 }
460 impl<T> MechFunction for $struct_name<T>
461 where
462 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
463 Ref<$matrix_shape<T>>: ToValue
464 {
465 fn solve(&self) {
466 unsafe {
467 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
468 let source_ptr = (*(self.source.as_ptr())).clone();
469 for i in 0..(sink_ptr).len() {
470 (sink_ptr)[i] = (source_ptr).clone();
471 }
472 }
473 }
474 fn out(&self) -> Value { self.sink.to_value() }
475 fn to_string(&self) -> String { format!("{:#?}", self) }
476 }};}
477
478impl_set_all_fxn!(Set1DARD,RowDVector);
479impl_set_all_fxn!(Set1DAVD,DVector);
480impl_set_all_fxn!(Set1DAMD,DMatrix);
481impl_set_all_fxn!(Set1DAR4,RowVector4);
482impl_set_all_fxn!(Set1DAR3,RowVector3);
483impl_set_all_fxn!(Set1DAR2,RowVector2);
484impl_set_all_fxn!(Set1DAV4,Vector4);
485impl_set_all_fxn!(Set1DAV3,Vector3);
486impl_set_all_fxn!(Set1DAV2,Vector2);
487impl_set_all_fxn!(Set1DAM4,Matrix4);
488impl_set_all_fxn!(Set1DAM3,Matrix3);
489impl_set_all_fxn!(Set1DAM2,Matrix2);
490impl_set_all_fxn!(Set1DAM1,Matrix1);
491impl_set_all_fxn!(Set1DAM2x3,Matrix2x3);
492impl_set_all_fxn!(Set1DAM3x2,Matrix3x2);
493
494macro_rules! impl_set_all_match_arms {
495 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
496 paste!{
497 match $arg {
498 $(
499 #[cfg(all(feature = $value_string, feature = "RowVector4"))]
500 (Value::[<Matrix $value_kind>](Matrix::RowVector4(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R4>] { sink: sink.clone(), source: source.clone() })),
501 #[cfg(all(feature = $value_string, feature = "RowVector3"))]
502 (Value::[<Matrix $value_kind>](Matrix::RowVector3(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R3>] { sink: sink.clone(), source: source.clone() })),
503 #[cfg(all(feature = $value_string, feature = "RowVector2"))]
504 (Value::[<Matrix $value_kind>](Matrix::RowVector2(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name R2>] { sink: sink.clone(), source: source.clone() })),
505 #[cfg(all(feature = $value_string, feature = "Vector4"))]
506 (Value::[<Matrix $value_kind>](Matrix::Vector4(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V4>] { sink: sink.clone(), source: source.clone() })),
507 #[cfg(all(feature = $value_string, feature = "Vector3"))]
508 (Value::[<Matrix $value_kind>](Matrix::Vector3(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V3>] { sink: sink.clone(), source: source.clone() })),
509 #[cfg(all(feature = $value_string, feature = "Vector2"))]
510 (Value::[<Matrix $value_kind>](Matrix::Vector2(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name V2>] { sink: sink.clone(), source: source.clone() })),
511 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
512 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), source: source.clone() })),
513 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
514 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), source: source.clone() })),
515 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
516 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), source: source.clone() })),
517 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
518 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), source: source.clone() })),
519 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
520 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), source: source.clone() })),
521 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
522 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), source: source.clone() })),
523 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
524 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), source: source.clone() })),
525 #[cfg(all(feature = $value_string, feature = "RowVectorD"))]
526 (Value::[<Matrix $value_kind>](Matrix::RowDVector(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name RD>] { sink: sink.clone(), source: source.clone() })),
527 #[cfg(all(feature = $value_string, feature = "VectorD"))]
528 (Value::[<Matrix $value_kind>](Matrix::DVector(sink)), [Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name VD>] { sink: sink.clone(), source: source.clone() })),
529 )+
530 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
531 }
532 }
533 }
534}
535
536fn impl_set_all_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
537 impl_set_match_arms!(Set1DA, all, (sink, ixes.as_slice(), source))
538}
539
540pub struct MatrixSetAll {}
541impl NativeFunctionCompiler for MatrixSetAll {
542 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
543 if arguments.len() <= 1 {
544 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
545 }
546 let sink: Value = arguments[0].clone();
547 let source: Value = arguments[1].clone();
548 let ixes = arguments.clone().split_off(2);
549 match impl_set_all_fxn(sink.clone(),source.clone(),ixes.clone()) {
550 Ok(fxn) => Ok(fxn),
551 Err(_) => {
552 match sink {
553 Value::MutableReference(sink) => { impl_set_all_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
554 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
555 }
556 }
557 }
558 }
559}
560
561macro_rules! set_2d_scalar_scalar {
564 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
565 ($sink).column_mut($ix2 - 1)[$ix1 - 1] = ($source).clone();
566 };}
567
568macro_rules! impl_set_scalar_scalar_fxn {
569 ($struct_name:ident, $matrix_shape:ident, $op:tt) => {
570 #[derive(Debug)]
571 struct $struct_name<T> {
572 source: Ref<T>,
573 ixes: (Ref<usize>,Ref<usize>),
574 sink: Ref<$matrix_shape<T>>,
575 }
576 impl<T> MechFunction for $struct_name<T>
577 where
578 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
579 Ref<$matrix_shape<T>>: ToValue
580 {
581 fn solve(&self) {
582 unsafe {
583 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
584 let source_ptr = (*(self.source.as_ptr())).clone();
585 let (ix1,ix2) = &self.ixes;
586 let ix1_ptr = (*(ix1.as_ptr())).clone();
587 let ix2_ptr = (*(ix2.as_ptr())).clone();
588 $op!(sink_ptr,ix1_ptr,ix2_ptr,source_ptr);
589 }
590 }
591 fn out(&self) -> Value { self.sink.to_value() }
592 fn to_string(&self) -> String { format!("{:#?}", self) }
593 }};}
594
595impl_set_scalar_scalar_fxn!(Set2DSSMD,DMatrix,set_2d_scalar_scalar);
596impl_set_scalar_scalar_fxn!(Set2DSSM4,Matrix4,set_2d_scalar_scalar);
597impl_set_scalar_scalar_fxn!(Set2DSSM3,Matrix3,set_2d_scalar_scalar);
598impl_set_scalar_scalar_fxn!(Set2DSSM2,Matrix2,set_2d_scalar_scalar);
599impl_set_scalar_scalar_fxn!(Set2DSSM1,Matrix1,set_2d_scalar_scalar);
600impl_set_scalar_scalar_fxn!(Set2DSSM2x3,Matrix2x3,set_2d_scalar_scalar);
601impl_set_scalar_scalar_fxn!(Set2DSSM3x2,Matrix3x2,set_2d_scalar_scalar);
602
603macro_rules! impl_set_scalar_scalar_match_arms {
604 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
605 paste!{
606 match $arg {
607 $(
608 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
609 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
610 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
611 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
612 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
613 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
614 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
615 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
616 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
617 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
618 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
619 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
620 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
621 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Index(ixx),Value::Index(ixy)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: (ixx.clone(),ixy.clone()), source: source.clone() })),
622 )+
623 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
624 }
625 }
626 }
627}
628
629fn impl_set_scalar_scalar_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
630 impl_set_match_arms!(Set2DSS, scalar_scalar, (sink, ixes.as_slice(), source))
631}
632
633pub struct MatrixSetScalarScalar {}
634impl NativeFunctionCompiler for MatrixSetScalarScalar {
635 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
636 if arguments.len() <= 1 {
637 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
638 }
639 let sink: Value = arguments[0].clone();
640 let source: Value = arguments[1].clone();
641 let ixes = arguments.clone().split_off(2);
642 match impl_set_scalar_scalar_fxn(sink.clone(),source.clone(),ixes.clone()) {
643 Ok(fxn) => Ok(fxn),
644 Err(_) => {
645 match sink {
646 Value::MutableReference(sink) => { impl_set_scalar_scalar_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
647 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
648 }
649 }
650 }
651 }
652}
653
654macro_rules! set_2d_all_scalar {
657 ($sink:expr, $source:expr) => {
658 for i in 0..$sink.nrows() {
659 ($sink)[i] = ($source).clone();
660 }
661 };}
662
663macro_rules! set_2d_all_vector {
664 ($sink:expr, $source:expr) => {
665 for i in 0..$sink.nrows() {
666 ($sink)[i] = ($source)[i].clone();
667 }
668 };}
669
670macro_rules! impl_set_all_scalar_fxn {
671 ($struct_name:ident, $matrix_shape:ident, $source_type:ty, $op:ident) => {
672 #[derive(Debug)]
673 struct $struct_name<T> {
674 source: Ref<$source_type>,
675 ix: Ref<usize>,
676 sink: Ref<$matrix_shape<T>>,
677 }
678 impl<T> MechFunction for $struct_name<T>
679 where
680 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
681 Ref<$matrix_shape<T>>: ToValue
682 {
683 fn solve(&self) {
684 unsafe {
685 let ix_ptr = *(self.ix.as_ptr());
686 let mut sink_ptr = (&mut *(self.sink.as_ptr())).column_mut(ix_ptr - 1);;
687 let source_ptr = (*(self.source.as_ptr())).clone();
688 $op!(sink_ptr,source_ptr);
689 }
690 }
691 fn out(&self) -> Value { self.sink.to_value() }
692 fn to_string(&self) -> String { format!("{:#?}", self) }
693 }};}
694
695impl_set_all_scalar_fxn!(Set2DASMD,DMatrix, T, set_2d_all_scalar);
696impl_set_all_scalar_fxn!(Set2DASM4,Matrix4, T, set_2d_all_scalar);
697impl_set_all_scalar_fxn!(Set2DASM3,Matrix3, T, set_2d_all_scalar);
698impl_set_all_scalar_fxn!(Set2DASM2,Matrix2, T, set_2d_all_scalar);
699impl_set_all_scalar_fxn!(Set2DASM1,Matrix1, T, set_2d_all_scalar);
700impl_set_all_scalar_fxn!(Set2DASM2x3,Matrix2x3, T, set_2d_all_scalar);
701impl_set_all_scalar_fxn!(Set2DASM3x2,Matrix3x2, T, set_2d_all_scalar);
702
703impl_set_all_scalar_fxn!(Set2DASM2x3V2,Matrix2x3, Vector2<T>, set_2d_all_vector);
704impl_set_all_scalar_fxn!(Set2DASM3x2V3,Matrix3x2, Vector3<T>, set_2d_all_vector);
705
706macro_rules! impl_set_all_scalar_match_arms {
707 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
708 paste!{
709 match $arg {
710 $(
711 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
712 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
713 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
714 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
715 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
716 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
717 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
718 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
719 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
720 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
721 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
722 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
723 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
724 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::IndexAll, Value::Index(ix)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
725
726 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
727 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind>](Matrix::Vector2(source))) => Ok(Box::new([<$fxn_name M2x3V2>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
728 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
729 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::IndexAll, Value::Index(ix)], Value::[<Matrix $value_kind>](Matrix::Vector3(source))) => Ok(Box::new([<$fxn_name M3x2V3>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
730 )+
731 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
732 }
733 }
734 }
735}
736
737fn impl_set_all_scalar_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
738 impl_set_match_arms!(Set2DAS, all_scalar, (sink, ixes.as_slice(), source))
739}
740
741pub struct MatrixSetAllScalar {}
742impl NativeFunctionCompiler for MatrixSetAllScalar {
743 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
744 if arguments.len() <= 1 {
745 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
746 }
747 let sink: Value = arguments[0].clone();
748 let source: Value = arguments[1].clone();
749 let ixes = arguments.clone().split_off(2);
750 match impl_set_all_scalar_fxn(sink.clone(),source.clone(),ixes.clone()) {
751 Ok(fxn) => Ok(fxn),
752 Err(x) => {
753 match sink {
754 Value::MutableReference(sink) => { impl_set_all_scalar_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
755 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}", x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
756 }
757 }
758 }
759 }
760}
761
762macro_rules! set_2d_scalar_all {
765 ($sink:expr, $ix:expr, $source:expr) => {
766 for i in 0..($sink).ncols() {
767 ($sink).row_mut($ix - 1)[i] = ($source).clone();
768 }
769 };}
770
771macro_rules! impl_set_scalar_all_fxn {
772 ($struct_name:ident, $matrix_shape:ident, $op:tt) => {
773 #[derive(Debug)]
774 struct $struct_name<T> {
775 source: Ref<T>,
776 ix: Ref<usize>,
777 sink: Ref<$matrix_shape<T>>,
778 }
779 impl<T> MechFunction for $struct_name<T>
780 where
781 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
782 Ref<$matrix_shape<T>>: ToValue
783 {
784 fn solve(&self) {
785 unsafe {
786 let ix_ptr = (*(self.ix.as_ptr())).clone();
787 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
788 let source_ptr = (*(self.source.as_ptr())).clone();
789 $op!(sink_ptr,ix_ptr,source_ptr);
790 }
791 }
792 fn out(&self) -> Value { self.sink.to_value() }
793 fn to_string(&self) -> String { format!("{:#?}", self) }
794 }};}
795
796impl_set_scalar_all_fxn!(Set2DSAMD,DMatrix, set_2d_scalar_all);
797impl_set_scalar_all_fxn!(Set2DSAM4,Matrix4, set_2d_scalar_all);
798impl_set_scalar_all_fxn!(Set2DSAM3,Matrix3, set_2d_scalar_all);
799impl_set_scalar_all_fxn!(Set2DSAM2,Matrix2, set_2d_scalar_all);
800impl_set_scalar_all_fxn!(Set2DSAM1,Matrix1, set_2d_scalar_all);
801impl_set_scalar_all_fxn!(Set2DSAM2x3,Matrix2x3, set_2d_scalar_all);
802impl_set_scalar_all_fxn!(Set2DSAM3x2,Matrix3x2, set_2d_scalar_all);
803
804macro_rules! impl_set_scalar_all_match_arms {
805 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
806 paste!{
807 match $arg {
808 $(
809 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
810 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
811 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
812 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
813 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
814 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
815 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
816 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
817 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
818 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
819 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
820 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
821 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
822 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Index(ix), Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ix: ix.clone(), source: source.clone() })),
823 )+
824 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
825 }
826 }
827 }
828}
829
830fn impl_set_scalar_all_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
831 impl_set_match_arms!(Set2DSA, scalar_all, (sink, ixes.as_slice(), source))
832}
833
834pub struct MatrixSetScalarAll {}
835impl NativeFunctionCompiler for MatrixSetScalarAll {
836 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
837 if arguments.len() <= 1 {
838 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
839 }
840 let sink: Value = arguments[0].clone();
841 let source: Value = arguments[1].clone();
842 let ixes = arguments.clone().split_off(2);
843 match impl_set_scalar_all_fxn(sink.clone(),source.clone(),ixes.clone()) {
844 Ok(fxn) => Ok(fxn),
845 Err(_) => {
846 match sink {
847 Value::MutableReference(sink) => { impl_set_scalar_all_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
848 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
849 }
850 }
851 }
852 }
853}
854
855macro_rules! set_2d_vector_scalar {
858 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
859 for rix in &$ix1 {
860 ($sink).row_mut(rix - 1)[$ix2 - 1] = ($source).clone();
861 }
862 };}
863
864macro_rules! set_2d_vector_scalar_b {
865 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
866 unsafe {
867 for rix in 0..($ix1).len() {
868 if $ix1[rix] == true {
869 ($sink).row_mut(rix)[$ix2 - 1] = ($source).clone();
870 }
871 }
872 }
873 };}
874
875macro_rules! impl_set_range_scalar_fxn {
876 ($struct_name:ident, $matrix_shape:ident, $op:tt, $ix_type:ty) => {
877 #[derive(Debug)]
878 struct $struct_name<T> {
879 source: Ref<T>,
880 ixes: (Ref<DVector<$ix_type>>,Ref<usize>),
881 sink: Ref<$matrix_shape<T>>,
882 }
883 impl<T> MechFunction for $struct_name<T>
884 where
885 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
886 Ref<$matrix_shape<T>>: ToValue
887 {
888 fn solve(&self) {
889 unsafe {
890 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
891 let source_ptr = (*(self.source.as_ptr())).clone();
892 let (ix1,ix2) = &self.ixes;
893 let ix1_ptr = (*(ix1.as_ptr())).clone();
894 let ix2_ptr = (*(ix2.as_ptr())).clone();
895 $op!(sink_ptr,ix1_ptr,ix2_ptr,source_ptr);
896 }
897 }
898 fn out(&self) -> Value { self.sink.to_value() }
899 fn to_string(&self) -> String { format!("{:#?}", self) }
900 }};}
901
902impl_set_range_scalar_fxn!(Set2DRSMD,DMatrix, set_2d_vector_scalar, usize);
903impl_set_range_scalar_fxn!(Set2DRSM4,Matrix4, set_2d_vector_scalar, usize);
904impl_set_range_scalar_fxn!(Set2DRSM3,Matrix3, set_2d_vector_scalar, usize);
905impl_set_range_scalar_fxn!(Set2DRSM2,Matrix2, set_2d_vector_scalar, usize);
906impl_set_range_scalar_fxn!(Set2DRSM1,Matrix1, set_2d_vector_scalar, usize);
907impl_set_range_scalar_fxn!(Set2DRSM2x3,Matrix2x3, set_2d_vector_scalar, usize);
908impl_set_range_scalar_fxn!(Set2DRSM3x2,Matrix3x2, set_2d_vector_scalar, usize);
909
910impl_set_range_scalar_fxn!(Set2DRSMDB,DMatrix, set_2d_vector_scalar_b, bool);
911impl_set_range_scalar_fxn!(Set2DRSM4B,Matrix4, set_2d_vector_scalar_b, bool);
912impl_set_range_scalar_fxn!(Set2DRSM3B,Matrix3, set_2d_vector_scalar_b, bool);
913impl_set_range_scalar_fxn!(Set2DRSM2B,Matrix2, set_2d_vector_scalar_b, bool);
914impl_set_range_scalar_fxn!(Set2DRSM1B,Matrix1, set_2d_vector_scalar_b, bool);
915impl_set_range_scalar_fxn!(Set2DRSM2x3B,Matrix2x3, set_2d_vector_scalar_b, bool);
916impl_set_range_scalar_fxn!(Set2DRSM3x2B,Matrix3x2, set_2d_vector_scalar_b, bool);
917
918macro_rules! impl_set_range_scalar_match_arms {
919 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
920 paste!{
921 match $arg {
922 $(
923 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
924 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
925 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
926 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
927 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
928 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
929 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
930 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
931 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
932 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
933 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
934 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
935 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
936 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
937
938 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
939 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
940 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
941 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
942 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
943 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
944 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
945 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
946 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
947 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
948 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
949 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
950 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
951 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::Index(ix2)], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
952
953 )+
954 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
955 }
956 }
957 }
958}
959
960fn impl_set_range_scalar_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
961 impl_set_match_arms!(Set2DRS, range_scalar, (sink, ixes.as_slice(), source))
962}
963
964pub struct MatrixSetRangeScalar {}
965impl NativeFunctionCompiler for MatrixSetRangeScalar {
966 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
967 if arguments.len() <= 1 {
968 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
969 }
970 let sink: Value = arguments[0].clone();
971 let source: Value = arguments[1].clone();
972 let ixes = arguments.clone().split_off(2);
973 match impl_set_range_scalar_fxn(sink.clone(),source.clone(),ixes.clone()) {
974 Ok(fxn) => Ok(fxn),
975 Err(_) => {
976 match sink {
977 Value::MutableReference(sink) => { impl_set_range_scalar_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
978 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
979 }
980 }
981 }
982 }
983}
984
985macro_rules! set_2d_scalar_vector {
988 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
989 for rix in &$ix2 {
990 ($sink).column_mut(rix - 1)[$ix1 - 1] = ($source).clone();
991 }
992 };}
993
994macro_rules! set_2d_scalar_vector_b {
995 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
996 unsafe {
997 for rix in 0..($ix2).len() {
998 if $ix2[rix] == true {
999 ($sink).row_mut(rix)[$ix1 - 1] = ($source).clone();
1000 }
1001 }
1002 }
1003 };}
1004
1005macro_rules! impl_set_scalar_range_fxn {
1006 ($struct_name:ident, $matrix_shape:ident, $op:tt, $ix_type:ty) => {
1007 #[derive(Debug)]
1008 struct $struct_name<T> {
1009 source: Ref<T>,
1010 ixes: (Ref<usize>,Ref<DVector<$ix_type>>),
1011 sink: Ref<$matrix_shape<T>>,
1012 }
1013 impl<T> MechFunction for $struct_name<T>
1014 where
1015 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
1016 Ref<$matrix_shape<T>>: ToValue
1017 {
1018 fn solve(&self) {
1019 unsafe {
1020 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
1021 let source_ptr = (*(self.source.as_ptr())).clone();
1022 let (ix1,ix2) = &self.ixes;
1023 let ix1_ptr = (*(ix1.as_ptr())).clone();
1024 let ix2_ptr = (*(ix2.as_ptr())).clone();
1025 $op!(sink_ptr,ix1_ptr,ix2_ptr,source_ptr);
1026 }
1027 }
1028 fn out(&self) -> Value { self.sink.to_value() }
1029 fn to_string(&self) -> String { format!("{:#?}", self) }
1030 }};}
1031
1032impl_set_scalar_range_fxn!(Set2DSRMD,DMatrix, set_2d_scalar_vector, usize);
1033impl_set_scalar_range_fxn!(Set2DSRM4,Matrix4, set_2d_scalar_vector, usize);
1034impl_set_scalar_range_fxn!(Set2DSRM3,Matrix3, set_2d_scalar_vector, usize);
1035impl_set_scalar_range_fxn!(Set2DSRM2,Matrix2, set_2d_scalar_vector, usize);
1036impl_set_scalar_range_fxn!(Set2DSRM1,Matrix1, set_2d_scalar_vector, usize);
1037impl_set_scalar_range_fxn!(Set2DSRM2x3,Matrix2x3, set_2d_scalar_vector, usize);
1038impl_set_scalar_range_fxn!(Set2DSRM3x2,Matrix3x2, set_2d_scalar_vector, usize);
1039
1040impl_set_scalar_range_fxn!(Set2DSRMDB,DMatrix, set_2d_scalar_vector_b, bool);
1041impl_set_scalar_range_fxn!(Set2DSRM4B,Matrix4, set_2d_scalar_vector_b, bool);
1042impl_set_scalar_range_fxn!(Set2DSRM3B,Matrix3, set_2d_scalar_vector_b, bool);
1043impl_set_scalar_range_fxn!(Set2DSRM2B,Matrix2, set_2d_scalar_vector_b, bool);
1044impl_set_scalar_range_fxn!(Set2DSRM1B,Matrix1, set_2d_scalar_vector_b, bool);
1045impl_set_scalar_range_fxn!(Set2DSRM2x3B,Matrix2x3, set_2d_scalar_vector_b, bool);
1046impl_set_scalar_range_fxn!(Set2DSRM3x2B,Matrix3x2, set_2d_scalar_vector_b, bool);
1047
1048macro_rules! impl_set_scalar_range_match_arms {
1049 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
1050 paste!{
1051 match $arg {
1052 $(
1053 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1054 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1055 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1056 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1057 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1058 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1059 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1060 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1061 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1062 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1063 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1064 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1065 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1066 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Index(ix1),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1067
1068 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1069 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1070 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1071 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1072 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1073 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1074 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1075 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1076 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1077 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1078 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1079 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1080 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1081 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::Index(ix1),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1082 )+
1083 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1084 }
1085 }
1086 }
1087}
1088
1089fn impl_set_scalar_range_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1090 impl_set_match_arms!(Set2DSR, scalar_range, (sink, ixes.as_slice(), source))
1091}
1092
1093pub struct MatrixSetScalarRange {}
1094impl NativeFunctionCompiler for MatrixSetScalarRange {
1095 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1096 if arguments.len() <= 1 {
1097 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1098 }
1099 let sink: Value = arguments[0].clone();
1100 let source: Value = arguments[1].clone();
1101 let ixes = arguments.clone().split_off(2);
1102 match impl_set_scalar_range_fxn(sink.clone(),source.clone(),ixes.clone()) {
1103 Ok(fxn) => Ok(fxn),
1104 Err(_) => {
1105 match sink {
1106 Value::MutableReference(sink) => { impl_set_scalar_range_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
1107 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1108 }
1109 }
1110 }
1111 }
1112}
1113
1114macro_rules! set_2d_vector_vector {
1117 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
1118 for cix in &$ix1 {
1119 for rix in &$ix2 {
1120 ($sink).column_mut(cix - 1)[rix - 1] = ($source).clone();
1121 }
1122 }
1123 };}
1124
1125macro_rules! set_2d_vector_vector_b {
1126 ($sink:expr, $ix1:expr, $ix2:expr, $source:expr) => {
1127 unsafe {
1128 for cix in 0..$ix1.len() {
1129 for rix in 0..$ix2.len() {
1130 if $ix1[cix] == true && $ix2[rix] == true {
1131 ($sink).row_mut(rix)[cix] = ($source).clone();
1132 }
1133 }
1134 }
1135 }
1136 };}
1137
1138macro_rules! impl_set_range_range_fxn {
1139 ($struct_name:ident, $matrix_shape:ident, $op:tt, $ix_type:ty) => {
1140 #[derive(Debug)]
1141 struct $struct_name<T> {
1142 source: Ref<T>,
1143 ixes: (Ref<DVector<$ix_type>>,Ref<DVector<$ix_type>>),
1144 sink: Ref<$matrix_shape<T>>,
1145 }
1146 impl<T> MechFunction for $struct_name<T>
1147 where
1148 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
1149 Ref<$matrix_shape<T>>: ToValue
1150 {
1151 fn solve(&self) {
1152 unsafe {
1153 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
1154 let source_ptr = (*(self.source.as_ptr())).clone();
1155 let (ix1,ix2) = &self.ixes;
1156 let ix1_ptr = (*(ix1.as_ptr())).clone();
1157 let ix2_ptr = (*(ix2.as_ptr())).clone();
1158 $op!(sink_ptr,ix1_ptr,ix2_ptr,source_ptr);
1159 }
1160 }
1161 fn out(&self) -> Value { self.sink.to_value() }
1162 fn to_string(&self) -> String { format!("{:#?}", self) }
1163 }};}
1164
1165impl_set_range_range_fxn!(Set2DRRMD,DMatrix,set_2d_vector_vector, usize);
1166impl_set_range_range_fxn!(Set2DRRM4,Matrix4,set_2d_vector_vector, usize);
1167impl_set_range_range_fxn!(Set2DRRM3,Matrix3,set_2d_vector_vector, usize);
1168impl_set_range_range_fxn!(Set2DRRM2,Matrix2,set_2d_vector_vector, usize);
1169impl_set_range_range_fxn!(Set2DRRM1,Matrix1,set_2d_vector_vector, usize);
1170impl_set_range_range_fxn!(Set2DRRM2x3,Matrix2x3,set_2d_vector_vector, usize);
1171impl_set_range_range_fxn!(Set2DRRM3x2,Matrix3x2,set_2d_vector_vector, usize);
1172
1173impl_set_range_range_fxn!(Set2DRRMDB,DMatrix,set_2d_vector_vector_b, bool);
1174impl_set_range_range_fxn!(Set2DRRM4B,Matrix4,set_2d_vector_vector_b, bool);
1175impl_set_range_range_fxn!(Set2DRRM3B,Matrix3,set_2d_vector_vector_b, bool);
1176impl_set_range_range_fxn!(Set2DRRM2B,Matrix2,set_2d_vector_vector_b, bool);
1177impl_set_range_range_fxn!(Set2DRRM1B,Matrix1,set_2d_vector_vector_b, bool);
1178impl_set_range_range_fxn!(Set2DRRM2x3B,Matrix2x3,set_2d_vector_vector_b, bool);
1179impl_set_range_range_fxn!(Set2DRRM3x2B,Matrix3x2,set_2d_vector_vector_b, bool);
1180
1181macro_rules! impl_set_range_range_match_arms {
1182 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
1183 paste!{
1184 match $arg {
1185 $(
1186 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1187 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1188 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1189 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1190 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1191 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1192 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1193 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1194 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1195 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1196 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1197 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1198 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1199 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix1)),Value::MatrixIndex(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1200
1201 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1202 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1203 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1204 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1205 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1206 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1207 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1208 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1209 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1210 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1211 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1212 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1213 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1214 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix1)),Value::MatrixBool(Matrix::DVector(ix2))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: (ix1.clone(), ix2.clone()), source: source.clone() })),
1215 )+
1216 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1217 }
1218 }
1219 }
1220}
1221
1222fn impl_set_range_range_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1223 impl_set_match_arms!(Set2DRR, range_range, (sink, ixes.as_slice(), source))
1224}
1225pub struct MatrixSetRangeRange {}
1226impl NativeFunctionCompiler for MatrixSetRangeRange {
1227 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1228 if arguments.len() <= 1 {
1229 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1230 }
1231 let sink: Value = arguments[0].clone();
1232 let source: Value = arguments[1].clone();
1233 let ixes = arguments.clone().split_off(2);
1234 match impl_set_range_range_fxn(sink.clone(),source.clone(),ixes.clone()) {
1235 Ok(fxn) => Ok(fxn),
1236 Err(_) => {
1237 match sink {
1238 Value::MutableReference(sink) => { impl_set_range_range_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
1239 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1240 }
1241 }
1242 }
1243 }
1244}
1245
1246macro_rules! set_2d_all_vector {
1249 ($sink:expr, $ix:expr, $source:expr) => {
1250 for cix in &$ix {
1251 for rix in 0..($sink).nrows() {
1252 ($sink).column_mut(cix - 1)[rix] = ($source).clone();
1253 }
1254 }
1255 };}
1256
1257macro_rules! set_2d_all_vector_b {
1258 ($sink:expr, $ix:expr, $source:expr) => {
1259 for cix in 0..$ix.len() {
1260 for rix in 0..($sink).nrows() {
1261 if $ix[cix] == true {
1262 ($sink).column_mut(cix)[rix] = ($source).clone();
1263 }
1264 }
1265 }
1266 };}
1267
1268macro_rules! impl_set_all_range_fxn {
1269 ($struct_name:ident, $matrix_shape:ident, $op:tt, $ix_type:ty) => {
1270 #[derive(Debug)]
1271 struct $struct_name<T> {
1272 source: Ref<T>,
1273 ixes: Ref<DVector<$ix_type>>,
1274 sink: Ref<$matrix_shape<T>>,
1275 }
1276 impl<T> MechFunction for $struct_name<T>
1277 where
1278 T: Copy + Debug + Clone + Sync + Send + PartialEq + 'static,
1279 Ref<$matrix_shape<T>>: ToValue
1280 {
1281 fn solve(&self) {
1282 unsafe {
1283 let ix_ptr = (*(self.ixes.as_ptr())).clone();
1284 let mut sink_ptr = (&mut *(self.sink.as_ptr()));
1285 let source_ptr = (*(self.source.as_ptr())).clone();
1286 $op!(sink_ptr,ix_ptr,source_ptr);
1287 }
1288 }
1289 fn out(&self) -> Value { self.sink.to_value() }
1290 fn to_string(&self) -> String { format!("{:#?}", self) }
1291 }};}
1292
1293impl_set_all_range_fxn!(Set2DARMD,DMatrix, set_2d_all_vector, usize);
1294impl_set_all_range_fxn!(Set2DARM4,Matrix4, set_2d_all_vector, usize);
1295impl_set_all_range_fxn!(Set2DARM3,Matrix3, set_2d_all_vector, usize);
1296impl_set_all_range_fxn!(Set2DARM2,Matrix2, set_2d_all_vector, usize);
1297impl_set_all_range_fxn!(Set2DARM1,Matrix1, set_2d_all_vector, usize);
1298impl_set_all_range_fxn!(Set2DARM2x3,Matrix2x3, set_2d_all_vector, usize);
1299impl_set_all_range_fxn!(Set2DARM3x2,Matrix3x2, set_2d_all_vector, usize);
1300
1301impl_set_all_range_fxn!(Set2DARMDB,DMatrix, set_2d_all_vector_b, bool);
1302impl_set_all_range_fxn!(Set2DARM4B,Matrix4, set_2d_all_vector_b, bool);
1303impl_set_all_range_fxn!(Set2DARM3B,Matrix3, set_2d_all_vector_b, bool);
1304impl_set_all_range_fxn!(Set2DARM2B,Matrix2, set_2d_all_vector_b, bool);
1305impl_set_all_range_fxn!(Set2DARM1B,Matrix1, set_2d_all_vector_b, bool);
1306impl_set_all_range_fxn!(Set2DARM2x3B,Matrix2x3, set_2d_all_vector_b, bool);
1307impl_set_all_range_fxn!(Set2DARM3x2B,Matrix3x2, set_2d_all_vector_b, bool);
1308
1309macro_rules! impl_set_all_range_match_arms {
1310 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
1311 paste!{
1312 match $arg {
1313 $(
1314 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1315 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1316 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1317 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1318 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1319 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1320 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1321 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1322 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1323 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1324 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1325 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1326 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1327 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::IndexAll,Value::MatrixIndex(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1328
1329 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1330 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1331 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1332 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1333 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1334 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1335 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1336 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1337 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1338 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1339 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1340 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1341 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1342 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::IndexAll,Value::MatrixBool(Matrix::DVector(ix))], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1343 )+
1344 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1345 }
1346 }
1347 }
1348}
1349
1350fn impl_set_all_range_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1351 impl_set_match_arms!(Set2DAR, all_range, (sink, ixes.as_slice(), source))
1352}
1353
1354pub struct MatrixSetAllRange {}
1355impl NativeFunctionCompiler for MatrixSetAllRange {
1356 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1357 if arguments.len() <= 1 {
1358 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1359 }
1360 let sink: Value = arguments[0].clone();
1361 let source: Value = arguments[1].clone();
1362 let ixes = arguments.clone().split_off(2);
1363 match impl_set_all_range_fxn(sink.clone(),source.clone(),ixes.clone()) {
1364 Ok(fxn) => Ok(fxn),
1365 Err(_) => {
1366 match sink {
1367 Value::MutableReference(sink) => { impl_set_all_range_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) }
1368 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1369 }
1370 }
1371 }
1372 }
1373}
1374
1375macro_rules! set_2d_vector_all {
1378 ($source:expr, $ix:expr, $sink:expr) => {
1379 for cix in 0..($sink).ncols() {
1380 for rix in &$ix {
1381 ($sink).column_mut(cix)[rix - 1] = ($source).clone();
1382 }
1383 }
1384 };}
1385
1386macro_rules! set_2d_vector_all_b {
1387 ($source:expr, $ix:expr, $sink:expr) => {
1388 for cix in 0..($sink).ncols() {
1389 for rix in 0..$ix.len() {
1390 if $ix[rix] == true {
1391 ($sink).column_mut(cix)[rix] = ($source).clone();
1392 }
1393 }
1394 }
1395 };}
1396
1397macro_rules! set_2d_vector_all_mat {
1398 ($source:expr, $ix:expr, $sink:expr) => {
1399 for (i,rix) in (&$ix).iter().enumerate() {
1400 let mut row = ($sink).row_mut(rix - 1);
1401 row.copy_from(&($source).row(i));
1402 }
1403 };}
1404
1405macro_rules! set_2d_vector_all_mat_b {
1406 ($source:expr, $ix:expr, $sink:expr) => {
1407 for (i,rix) in (&$ix).iter().enumerate() {
1408 if *rix == true {
1409 let mut row = ($sink).row_mut(i);
1410 row.copy_from(&($source).row(i));
1411 }
1412 }
1413 };}
1414
1415impl_set_fxn!(Set2DRAMD,DMatrix,T,set_2d_vector_all,usize);
1416impl_set_fxn!(Set2DRAM4,Matrix4,T,set_2d_vector_all,usize);
1417impl_set_fxn!(Set2DRAM3,Matrix3,T,set_2d_vector_all,usize);
1418impl_set_fxn!(Set2DRAM2,Matrix2,T,set_2d_vector_all,usize);
1419impl_set_fxn!(Set2DRAM1,Matrix1,T,set_2d_vector_all,usize);
1420impl_set_fxn!(Set2DRAM2x3,Matrix2x3,T,set_2d_vector_all,usize);
1421impl_set_fxn!(Set2DRAM3x2,Matrix3x2,T,set_2d_vector_all,usize);
1422
1423impl_set_fxn!(Set2DRAMDMD,DMatrix,DMatrix<T>,set_2d_vector_all_mat,usize);
1424impl_set_fxn!(Set2DRAMDM2,DMatrix,Matrix2<T>,set_2d_vector_all_mat,usize);
1425impl_set_fxn!(Set2DRAMDM2x3,DMatrix,Matrix2x3<T>,set_2d_vector_all_mat,usize);
1426impl_set_fxn!(Set2DRAMDM3,DMatrix,Matrix3<T>,set_2d_vector_all_mat,usize);
1427impl_set_fxn!(Set2DRAMDM3x2,DMatrix,Matrix3x2<T>,set_2d_vector_all_mat,usize);
1428impl_set_fxn!(Set2DRAMDM4,DMatrix,Matrix4<T>,set_2d_vector_all_mat,usize);
1429
1430impl_set_fxn!(Set2DRAM2M2,Matrix2,Matrix2<T>,set_2d_vector_all_mat,usize);
1431impl_set_fxn!(Set2DRAM2M3x2,Matrix2,Matrix3x2<T>,set_2d_vector_all_mat,usize);
1432impl_set_fxn!(Set2DRAM2MD,Matrix2,DMatrix<T>,set_2d_vector_all_mat,usize);
1433
1434impl_set_fxn!(Set2DRAM3M3,Matrix3,Matrix3<T>,set_2d_vector_all_mat,usize);
1435impl_set_fxn!(Set2DRAM3M2x3,Matrix3,Matrix2x3<T>,set_2d_vector_all_mat,usize);
1436impl_set_fxn!(Set2DRAM3MD,Matrix3,DMatrix<T>,set_2d_vector_all_mat,usize);
1437
1438impl_set_fxn!(Set2DRAM3x2M3x2,Matrix3x2,Matrix3x2<T>,set_2d_vector_all_mat,usize);
1439impl_set_fxn!(Set2DRAM3x2M2,Matrix3x2,Matrix2<T>,set_2d_vector_all_mat,usize);
1440impl_set_fxn!(Set2DRAM3x2MD,Matrix3x2,DMatrix<T>,set_2d_vector_all_mat,usize);
1441
1442impl_set_fxn!(Set2DRAM2x3M2x3,Matrix2x3,Matrix2x3<T>,set_2d_vector_all_mat,usize);
1443impl_set_fxn!(Set2DRAM2x3M3,Matrix2x3,Matrix3<T>,set_2d_vector_all_mat,usize);
1444impl_set_fxn!(Set2DRAM2x3MD,Matrix2x3,DMatrix<T>,set_2d_vector_all_mat,usize);
1445
1446impl_set_fxn!(Set2DRAM4M4,Matrix4,Matrix4<T>,set_2d_vector_all_mat,usize);
1447impl_set_fxn!(Set2DRAM4MD,Matrix4,DMatrix<T>,set_2d_vector_all_mat,usize);
1448
1449impl_set_fxn!(Set2DRAMDB,DMatrix,T,set_2d_vector_all_b,bool);
1450impl_set_fxn!(Set2DRAM4B,Matrix4,T,set_2d_vector_all_b,bool);
1451impl_set_fxn!(Set2DRAM3B,Matrix3,T,set_2d_vector_all_b,bool);
1452impl_set_fxn!(Set2DRAM2B,Matrix2,T,set_2d_vector_all_b,bool);
1453impl_set_fxn!(Set2DRAM1B,Matrix1,T,set_2d_vector_all_b,bool);
1454impl_set_fxn!(Set2DRAM2x3B,Matrix2x3,T,set_2d_vector_all_b,bool);
1455impl_set_fxn!(Set2DRAM3x2B,Matrix3x2,T,set_2d_vector_all_b,bool);
1456
1457impl_set_fxn!(Set2DRAMDMDB,DMatrix,DMatrix<T>,set_2d_vector_all_mat_b,bool);
1458impl_set_fxn!(Set2DRAM2M2B,Matrix2,Matrix2<T>,set_2d_vector_all_mat_b,bool);
1459impl_set_fxn!(Set2DRAM3M3B,Matrix3,Matrix3<T>,set_2d_vector_all_mat_b,bool);
1460impl_set_fxn!(Set2DRAM4M4B,Matrix4,Matrix4<T>,set_2d_vector_all_mat_b,bool);
1461impl_set_fxn!(Set2DRAM3x2M3x2B,Matrix3x2,Matrix3x2<T>,set_2d_vector_all_mat_b,bool);
1462impl_set_fxn!(Set2DRAM2x3M2x3B,Matrix2x3,Matrix2x3<T>,set_2d_vector_all_mat_b,bool);
1463
1464#[macro_export]
1465macro_rules! impl_set_range_all_match_arms {
1466 ($fxn_name:ident, $arg:expr, $($value_kind:ident, $value_string:tt);+ $(;)?) => {
1467 paste!{
1468 match $arg {
1469 $(
1470 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1471 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1472 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1473 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1474 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1475 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1476 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1477 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1478 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1479 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1480 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1481 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1482
1483 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1484 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1485 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1486 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDMD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1487 #[cfg(all(feature = $value_string, feature = "MatrixD", feature = "Matrix2"))]
1488 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDM2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1489 #[cfg(all(feature = $value_string, feature = "MatrixD", feature = "Matrix2x3"))]
1490 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2x3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDM2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1491 #[cfg(all(feature = $value_string, feature = "MatrixD", feature = "Matrix3"))]
1492 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDM3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1493 #[cfg(all(feature = $value_string, feature = "MatrixD", feature = "Matrix3x2"))]
1494 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3x2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDM3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1495 #[cfg(all(feature = $value_string, feature = "MatrixD", feature = "Matrix4"))]
1496 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix4(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDM4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1497
1498 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1499 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1500 #[cfg(all(feature = $value_string, feature = "Matrix2", feature = "Matrix3x2"))]
1501 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3x2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1502 #[cfg(all(feature = $value_string, feature = "Matrix2", feature = "MatrixD"))]
1503 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1504
1505 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1506 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1507 #[cfg(all(feature = $value_string, feature = "Matrix3", feature = "Matrix2x3"))]
1508 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2x3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1509 #[cfg(all(feature = $value_string, feature = "Matrix3", feature = "MatrixD"))]
1510 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1511
1512 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1513 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix4(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M4M4>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1514 #[cfg(all(feature = $value_string, feature = "Matrix4", feature = "MatrixD"))]
1515 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M4MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1516
1517 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1518 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2x3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2x3M2x3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1519 #[cfg(all(feature = $value_string, feature = "Matrix2x3", feature = "Matrix3"))]
1520 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2x3M3>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1521 #[cfg(all(feature = $value_string, feature = "Matrix2x3", feature = "MatrixD"))]
1522 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2x3MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1523
1524 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1525 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3x2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3x2M3x2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1526 #[cfg(all(feature = $value_string, feature = "Matrix3x2", feature = "Matrix2"))]
1527 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3x2M2>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1528 #[cfg(all(feature = $value_string, feature = "Matrix3x2", feature = "MatrixD"))]
1529 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixIndex(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3x2MD>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1530
1531 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1532 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1533 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1534 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1535 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1536 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1537 #[cfg(all(feature = $value_string, feature = "Matrix1"))]
1538 (Value::[<Matrix $value_kind>](Matrix::Matrix1(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M1B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1539 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1540 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M2x3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1541 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1542 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name M3x2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1543 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1544 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::$value_kind(source)) => Ok(Box::new([<$fxn_name MDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1545
1546 #[cfg(all(feature = $value_string, feature = "MatrixD"))]
1547 (Value::[<Matrix $value_kind>](Matrix::DMatrix(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::DMatrix(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name MDMDB>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1548 #[cfg(all(feature = $value_string, feature = "Matrix2"))]
1549 (Value::[<Matrix $value_kind>](Matrix::Matrix2(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2M2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1550 #[cfg(all(feature = $value_string, feature = "Matrix3"))]
1551 (Value::[<Matrix $value_kind>](Matrix::Matrix3(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3M3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1552 #[cfg(all(feature = $value_string, feature = "Matrix4"))]
1553 (Value::[<Matrix $value_kind>](Matrix::Matrix4(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix4(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M4M4B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1554 #[cfg(all(feature = $value_string, feature = "Matrix2x3"))]
1555 (Value::[<Matrix $value_kind>](Matrix::Matrix2x3(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix2x3(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M2x3M2x3B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1556 #[cfg(all(feature = $value_string, feature = "Matrix3x2"))]
1557 (Value::[<Matrix $value_kind>](Matrix::Matrix3x2(sink)), [Value::MatrixBool(Matrix::DVector(ix)),Value::IndexAll], Value::[<Matrix $value_kind>](Matrix::Matrix3x2(source))) if ix.borrow().len() == source.borrow().nrows() && sink.borrow().ncols() == source.borrow().ncols() => Ok(Box::new([<$fxn_name M3x2M3x2B>] { sink: sink.clone(), ixes: ix.clone(), source: source.clone() })),
1558 )+
1559 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1560 }
1561 }
1562 }
1563}
1564
1565fn impl_set_range_all_fxn(sink: Value, source: Value, ixes: Vec<Value>) -> Result<Box<dyn MechFunction>, MechError> {
1566 impl_set_match_arms!(Set2DRA, range_all, (sink, ixes.as_slice(), source))
1567}
1568
1569pub struct MatrixSetRangeAll {}
1570impl NativeFunctionCompiler for MatrixSetRangeAll {
1571 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
1572 if arguments.len() <= 1 {
1573 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
1574 }
1575 let sink: Value = arguments[0].clone();
1576 let source: Value = arguments[1].clone();
1577 let ixes = arguments.clone().split_off(2);
1578 match impl_set_range_all_fxn(sink.clone(),source.clone(),ixes.clone()) {
1579 Ok(fxn) => Ok(fxn),
1580 Err(_) => {
1581 match (sink,ixes,source) {
1582 (Value::MutableReference(sink),ixes,Value::MutableReference(source)) => { impl_set_range_all_fxn(sink.borrow().clone(),source.borrow().clone(),ixes.clone()) },
1583 (sink,ixes,Value::MutableReference(source)) => { impl_set_range_all_fxn(sink.clone(),source.borrow().clone(),ixes.clone()) },
1584 (Value::MutableReference(sink),ixes,source) => { impl_set_range_all_fxn(sink.borrow().clone(),source.clone(),ixes.clone()) },
1585 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
1586 }
1587 }
1588 }
1589 }
1590}