concision_core/ops/pad/
mode.rs

1/*
2    Appellation: mode <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use num::Zero;
6
7#[derive(
8    Clone,
9    Copy,
10    Debug,
11    Default,
12    Eq,
13    Hash,
14    Ord,
15    PartialEq,
16    PartialOrd,
17    scsys_derive::VariantConstructors,
18    strum::AsRefStr,
19    strum::Display,
20    strum::EnumCount,
21    strum::EnumIs,
22    strum::EnumIter,
23    strum::EnumString,
24    strum::VariantArray,
25    strum::VariantNames,
26)]
27#[cfg_attr(
28    feature = "serde",
29    derive(serde::Deserialize, serde::Serialize),
30    serde(rename_all = "snake_case", untagged)
31)]
32#[strum(serialize_all = "snake_case")]
33pub enum PadAction {
34    Clipping,
35    Lane,
36    Reflecting,
37    #[default]
38    StopAfterCopy,
39    Wrapping,
40}
41
42#[derive(
43    Clone,
44    Copy,
45    Debug,
46    Eq,
47    Hash,
48    Ord,
49    PartialEq,
50    PartialOrd,
51    strum::AsRefStr,
52    strum::Display,
53    strum::EnumCount,
54    strum::EnumIs,
55    strum::VariantNames,
56)]
57#[cfg_attr(
58    feature = "serde",
59    derive(serde::Deserialize, serde::Serialize),
60    serde(rename_all = "snake_case")
61)]
62#[strum(serialize_all = "snake_case")]
63#[repr(C)]
64#[derive(Default)]
65pub enum PadMode<T = f64> {
66    Constant(T),
67    Edge,
68    Maximum,
69    Mean,
70    Median,
71    Minimum,
72    Mode,
73    Reflect,
74    Symmetric,
75    #[default]
76    Wrap,
77}
78
79
80impl<T> From<T> for PadMode<T> {
81    fn from(value: T) -> Self {
82        PadMode::Constant(value)
83    }
84}
85
86impl<T> PadMode<T> {
87    pub fn as_pad_action(&self) -> PadAction {
88        match *self {
89            PadMode::Constant(_) => PadAction::StopAfterCopy,
90            PadMode::Edge => PadAction::Clipping,
91            PadMode::Maximum => PadAction::Clipping,
92            PadMode::Mean => PadAction::Clipping,
93            PadMode::Median => PadAction::Clipping,
94            PadMode::Minimum => PadAction::Clipping,
95            PadMode::Mode => PadAction::Clipping,
96            PadMode::Reflect => PadAction::Reflecting,
97            PadMode::Symmetric => PadAction::Reflecting,
98            PadMode::Wrap => PadAction::Wrapping,
99        }
100    }
101
102    pub fn into_pad_action(self) -> PadAction {
103        match self {
104            PadMode::Constant(_) => PadAction::StopAfterCopy,
105            PadMode::Edge => PadAction::Clipping,
106            PadMode::Maximum => PadAction::Clipping,
107            PadMode::Mean => PadAction::Clipping,
108            PadMode::Median => PadAction::Clipping,
109            PadMode::Minimum => PadAction::Clipping,
110            PadMode::Mode => PadAction::Clipping,
111            PadMode::Reflect => PadAction::Reflecting,
112            PadMode::Symmetric => PadAction::Reflecting,
113            PadMode::Wrap => PadAction::Wrapping,
114        }
115    }
116    pub fn init(&self) -> T
117    where
118        T: Copy + Zero,
119    {
120        match *self {
121            PadMode::Constant(v) => v,
122            _ => T::zero(),
123        }
124    }
125}