Skip to main content

ninterp/strategy/enums/
one.rs

1use super::*;
2
3/// See [enums module](super) documentation.
4#[allow(missing_docs)]
5#[derive(Debug, Clone, PartialEq)]
6#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
7#[cfg_attr(feature = "serde", serde(untagged))]
8pub enum Strategy1DEnum {
9    Linear(strategy::Linear),
10    Nearest(strategy::Nearest),
11    LeftNearest(strategy::LeftNearest),
12    RightNearest(strategy::RightNearest),
13}
14
15impl From<Linear> for Strategy1DEnum {
16    #[inline]
17    fn from(strategy: Linear) -> Self {
18        Self::Linear(strategy)
19    }
20}
21
22impl From<Nearest> for Strategy1DEnum {
23    #[inline]
24    fn from(strategy: Nearest) -> Self {
25        Self::Nearest(strategy)
26    }
27}
28
29impl From<LeftNearest> for Strategy1DEnum {
30    #[inline]
31    fn from(strategy: LeftNearest) -> Self {
32        Self::LeftNearest(strategy)
33    }
34}
35
36impl From<RightNearest> for Strategy1DEnum {
37    #[inline]
38    fn from(strategy: RightNearest) -> Self {
39        Self::RightNearest(strategy)
40    }
41}
42
43impl<D> Strategy1D<D> for Strategy1DEnum
44where
45    D: Data + RawDataClone + Clone,
46    D::Elem: Num + PartialOrd + Copy + Debug,
47{
48    #[inline]
49    fn init(&mut self, data: &InterpData1D<D>) -> Result<(), ValidateError> {
50        match self {
51            Strategy1DEnum::Linear(strategy) => Strategy1D::<D>::init(strategy, data),
52            Strategy1DEnum::Nearest(strategy) => Strategy1D::<D>::init(strategy, data),
53            Strategy1DEnum::LeftNearest(strategy) => Strategy1D::<D>::init(strategy, data),
54            Strategy1DEnum::RightNearest(strategy) => Strategy1D::<D>::init(strategy, data),
55        }
56    }
57
58    #[inline]
59    fn interpolate(
60        &self,
61        data: &InterpData1D<D>,
62        point: &[D::Elem; 1],
63    ) -> Result<D::Elem, InterpolateError> {
64        match self {
65            Strategy1DEnum::Linear(strategy) => Strategy1D::<D>::interpolate(strategy, data, point),
66            Strategy1DEnum::Nearest(strategy) => {
67                Strategy1D::<D>::interpolate(strategy, data, point)
68            }
69            Strategy1DEnum::LeftNearest(strategy) => {
70                Strategy1D::<D>::interpolate(strategy, data, point)
71            }
72            Strategy1DEnum::RightNearest(strategy) => {
73                Strategy1D::<D>::interpolate(strategy, data, point)
74            }
75        }
76    }
77
78    #[inline]
79    fn allow_extrapolate(&self) -> bool {
80        match self {
81            Strategy1DEnum::Linear(strategy) => Strategy1D::<D>::allow_extrapolate(strategy),
82            Strategy1DEnum::Nearest(strategy) => Strategy1D::<D>::allow_extrapolate(strategy),
83            Strategy1DEnum::LeftNearest(strategy) => Strategy1D::<D>::allow_extrapolate(strategy),
84            Strategy1DEnum::RightNearest(strategy) => Strategy1D::<D>::allow_extrapolate(strategy),
85        }
86    }
87}
88
89#[cfg(test)]
90mod tests {
91    #[allow(unused_imports)]
92    use super::*;
93
94    #[test]
95    #[cfg(feature = "serde")]
96    fn test_serde() {
97        assert_eq!(
98            serde_json::to_string(&Strategy1DEnum::from(Linear)).unwrap(),
99            serde_json::to_string(&Linear).unwrap(),
100        );
101        assert_eq!(
102            serde_json::to_string(&Strategy1DEnum::from(Nearest)).unwrap(),
103            serde_json::to_string(&Nearest).unwrap(),
104        );
105        assert_eq!(
106            serde_json::to_string(&Strategy1DEnum::from(LeftNearest)).unwrap(),
107            serde_json::to_string(&LeftNearest).unwrap(),
108        );
109        assert_eq!(
110            serde_json::to_string(&Strategy1DEnum::from(RightNearest)).unwrap(),
111            serde_json::to_string(&RightNearest).unwrap(),
112        );
113    }
114}