concision_core/ops/pad/
mode.rs1use 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}