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
79impl<T> From<T> for PadMode<T> {
80    fn from(value: T) -> Self {
81        PadMode::Constant(value)
82    }
83}
84
85impl<T> PadMode<T> {
86    pub fn as_pad_action(&self) -> PadAction {
87        match *self {
88            PadMode::Constant(_) => PadAction::StopAfterCopy,
89            PadMode::Edge => PadAction::Clipping,
90            PadMode::Maximum => PadAction::Clipping,
91            PadMode::Mean => PadAction::Clipping,
92            PadMode::Median => PadAction::Clipping,
93            PadMode::Minimum => PadAction::Clipping,
94            PadMode::Mode => PadAction::Clipping,
95            PadMode::Reflect => PadAction::Reflecting,
96            PadMode::Symmetric => PadAction::Reflecting,
97            PadMode::Wrap => PadAction::Wrapping,
98        }
99    }
100
101    pub fn into_pad_action(self) -> PadAction {
102        match self {
103            PadMode::Constant(_) => PadAction::StopAfterCopy,
104            PadMode::Edge => PadAction::Clipping,
105            PadMode::Maximum => PadAction::Clipping,
106            PadMode::Mean => PadAction::Clipping,
107            PadMode::Median => PadAction::Clipping,
108            PadMode::Minimum => PadAction::Clipping,
109            PadMode::Mode => PadAction::Clipping,
110            PadMode::Reflect => PadAction::Reflecting,
111            PadMode::Symmetric => PadAction::Reflecting,
112            PadMode::Wrap => PadAction::Wrapping,
113        }
114    }
115    pub fn init(&self) -> T
116    where
117        T: Copy + Zero,
118    {
119        match *self {
120            PadMode::Constant(v) => v,
121            _ => T::zero(),
122        }
123    }
124}