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