1#![feature(step_trait)]
2use crate::*;
3use mech_core::*;
4use std::iter::Step;
5
6#[derive(Debug)]
9struct RangeInclusiveScalar<T> {
10 max: Ref<T>,
11 min: Ref<T>,
12 out: Ref<RowDVector<T>>,
13}
14
15impl<T> MechFunction for RangeInclusiveScalar<T>
16where
17 T: Copy + Debug + Clone + Sync + Send + Step + PartialEq + 'static,
18 Ref<RowDVector<T>>: ToValue
19{
20 fn solve(&self) {
21 let max_ptr = self.max.as_ptr();
22 let min_ptr = self.min.as_ptr();
23 let out_ptr = self.out.as_ptr();
24
25 unsafe {
26 let rng = (*min_ptr..=*max_ptr).collect::<Vec<T>>();
27 *out_ptr = RowDVector::from_vec(rng);
28 }
29 }
30 fn out(&self) -> Value { self.out.to_value() }
31 fn to_string(&self) -> String { format!("{:#?}", self)}
32}
33
34pub struct RangeInclusive {}
35
36impl NativeFunctionCompiler for RangeInclusive {
37 fn compile(&self, arguments: &Vec<Value>) -> MResult<Box<dyn MechFunction>> {
38 if arguments.len() != 2 {
39 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::IncorrectNumberOfArguments});
40 }
41 match (arguments[0].clone(), arguments[1].clone()) {
42 (Value::I8(min), Value::I8(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
43 (Value::I16(min), Value::I16(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
44 (Value::I32(min), Value::I32(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
45 (Value::I64(min), Value::I64(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
46 (Value::I128(min), Value::I128(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
47 (Value::U8(min), Value::U8(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
48 (Value::U16(min), Value::U16(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
49 (Value::U32(min), Value::U32(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
50 (Value::U64(min), Value::U64(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
51 (Value::U128(min), Value::U128(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,0))})),
52 (Value::F32(min), Value::F32(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,F32::new(0.0)))})),
53 (Value::F64(min), Value::F64(max)) => Ok(Box::new(RangeInclusiveScalar{max,min, out: new_ref(RowDVector::from_element(1,F64::new(0.0)))})),
54 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind})
55 }
56 }
57}