Skip to main content

reda_spice/model/
value.rs

1use reda_unit::{Complex, Number, Unit, UnitComplex, UnitNumber};
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum Value {
5    Real(Number),
6    Complex(Complex),
7}
8
9impl Value {
10    pub fn real<V: Into<Number>>(v: V) -> Self {
11        Self::Real(v.into())
12    }
13
14    pub fn complex<V1: Into<Number>, V2: Into<Number>>(re: V1, im: V2) -> Self {
15        Self::Complex(Complex::new(re.into(), im.into()))
16    }
17}
18
19impl Value {
20    pub fn extract_numbers(values: &[Self]) -> Option<Vec<Number>> {
21        let mut numbers = Vec::new(); 
22        for v in values.iter() {
23            match v {
24                Value::Real(r) => numbers.push(*r),
25                Value::Complex(_) => return None,
26            }
27        }
28        Some(numbers)
29    }
30
31    pub fn extract_complexs(values: &[Self]) -> Option<Vec<Complex>> {
32        let mut complexs = Vec::new(); 
33        for v in values.iter() {
34            match v {
35                Value::Real(_) => return None,
36                Value::Complex(c) => complexs.push(*c),
37            }
38        }
39        Some(complexs)
40    }
41
42    pub fn extract_units<U: Unit>(values: &[Self]) -> Option<Vec<UnitNumber<U>>> {
43        let mut numbers = Vec::new(); 
44        for v in values.iter() {
45            match v {
46                Value::Real(r) => numbers.push(UnitNumber::new(*r)),
47                Value::Complex(_) => return None,
48            }
49        }
50        Some(numbers)
51    }
52
53    pub fn extract_unit_complexs<U: Unit>(values: &[Self]) -> Option<Vec<UnitComplex<U>>> {
54        let mut numbers = Vec::new(); 
55        for v in values.iter() {
56            match v {
57                Value::Real(_) => return None,
58                Value::Complex(c) => numbers.push(UnitComplex::new(c.re, c.im)),
59            }
60        }
61        Some(numbers)
62    }
63}