mech_range/
inclusive.rs

1#![feature(step_trait)]
2use crate::*;
3use mech_core::*;
4use std::iter::Step;
5
6// Inclusive ------------------------------------------------------------------
7
8#[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}