ninterp 0.8.2

Numerical interpolation for N-dimensional rectilinear grids
Documentation
use super::*;

/// See [enums module](super) documentation.
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(feature = "serde", serde(untagged))]
pub enum StrategyNDEnum {
    Linear(strategy::Linear),
    Nearest(strategy::Nearest),
}

impl From<Linear> for StrategyNDEnum {
    #[inline]
    fn from(strategy: Linear) -> Self {
        StrategyNDEnum::Linear(strategy)
    }
}

impl From<Nearest> for StrategyNDEnum {
    #[inline]
    fn from(strategy: Nearest) -> Self {
        StrategyNDEnum::Nearest(strategy)
    }
}

impl<D> StrategyND<D> for StrategyNDEnum
where
    D: Data + RawDataClone + Clone,
    D::Elem: Num + PartialOrd + Copy + Debug,
{
    #[inline]
    fn init(&mut self, data: &InterpDataND<D>) -> Result<(), ValidateError> {
        match self {
            StrategyNDEnum::Linear(strategy) => StrategyND::<D>::init(strategy, data),
            StrategyNDEnum::Nearest(strategy) => StrategyND::<D>::init(strategy, data),
        }
    }

    #[inline]
    fn interpolate(
        &self,
        data: &InterpDataND<D>,
        point: &[D::Elem],
    ) -> Result<D::Elem, InterpolateError> {
        match self {
            StrategyNDEnum::Linear(strategy) => StrategyND::<D>::interpolate(strategy, data, point),
            StrategyNDEnum::Nearest(strategy) => {
                StrategyND::<D>::interpolate(strategy, data, point)
            }
        }
    }

    #[inline]
    fn allow_extrapolate(&self) -> bool {
        match self {
            StrategyNDEnum::Linear(strategy) => StrategyND::<D>::allow_extrapolate(strategy),
            StrategyNDEnum::Nearest(strategy) => StrategyND::<D>::allow_extrapolate(strategy),
        }
    }
}

#[cfg(test)]
mod tests {
    #[allow(unused_imports)]
    use super::*;

    #[test]
    #[cfg(feature = "serde")]
    fn test_serde() {
        assert_eq!(
            serde_json::to_string(&StrategyNDEnum::from(Linear)).unwrap(),
            serde_json::to_string(&Linear).unwrap(),
        );
        assert_eq!(
            serde_json::to_string(&StrategyNDEnum::from(Nearest)).unwrap(),
            serde_json::to_string(&Nearest).unwrap(),
        );
    }
}