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