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}