concision_core/ops/pad/
mode.rs

1/*
2    Appellation: mode <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use crate::ops::pad::PadAction;
6use num::Zero;
7use smart_default::SmartDefault;
8use strum::{AsRefStr, Display, EnumCount, EnumIs, VariantNames};
9
10#[derive(
11    AsRefStr,
12    Clone,
13    Copy,
14    Debug,
15    Display,
16    EnumCount,
17    EnumIs,
18    Eq,
19    Hash,
20    Ord,
21    PartialEq,
22    PartialOrd,
23    SmartDefault,
24    VariantNames,
25)]
26#[cfg_attr(
27    feature = "serde",
28    derive(serde::Deserialize, serde::Serialize),
29    serde(rename_all = "lowercase", untagged)
30)]
31#[repr(C)]
32#[strum(serialize_all = "snake_case")]
33pub enum PadMode<T> {
34    Constant(T),
35    Edge,
36    Maximum,
37    Mean,
38    Median,
39    Minimum,
40    Mode,
41    Reflect,
42    Symmetric,
43    #[default]
44    Wrap,
45}
46
47impl<T> From<T> for PadMode<T> {
48    fn from(value: T) -> Self {
49        PadMode::Constant(value)
50    }
51}
52
53impl<T> PadMode<T> {
54    pub(crate) fn action(&self) -> PadAction {
55        match self {
56            PadMode::Constant(_) => PadAction::StopAfterCopy,
57            PadMode::Edge => PadAction::Clipping,
58            PadMode::Maximum => PadAction::Clipping,
59            PadMode::Mean => PadAction::Clipping,
60            PadMode::Median => PadAction::Clipping,
61            PadMode::Minimum => PadAction::Clipping,
62            PadMode::Mode => PadAction::Clipping,
63            PadMode::Reflect => PadAction::Reflecting,
64            PadMode::Symmetric => PadAction::Reflecting,
65            PadMode::Wrap => PadAction::Wrapping,
66        }
67    }
68    pub fn init(&self) -> T
69    where
70        T: Copy + Zero,
71    {
72        match *self {
73            PadMode::Constant(v) => v,
74            _ => T::zero(),
75        }
76    }
77}