ninterp/strategy/enums/
one.rs1use super::*;
2
3#[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}