OXYGENHUB
◆ v0.4.3 oxygen / vendor / crc-fast / src / enums.rs
8.5 KiB · Rust · last changed Strata: the cloud stores send through ureq, so every release target links 1 month ago source blame history raw
2cd40ea1 Andy McCall ↶ 1
// Copyright 2025 Don MacAskill. Licensed under MIT or Apache-2.0.
2
3
use crate::consts::*;
4
use crate::CrcAlgorithm;
5
use core::fmt::{Display, Formatter};
6
use core::str::FromStr;
7
8
impl FromStr for CrcAlgorithm {
9
    type Err = ();
10
11
    fn from_str(s: &str) -> Result<Self, Self::Err> {
12
        match s {
13
            NAME_CRC16_ARC => Ok(CrcAlgorithm::Crc16Arc),
14
            NAME_CRC16_CDMA2000 => Ok(CrcAlgorithm::Crc16Cdma2000),
15
            NAME_CRC16_CMS => Ok(CrcAlgorithm::Crc16Cms),
16
            NAME_CRC16_DDS_110 => Ok(CrcAlgorithm::Crc16Dds110),
17
            NAME_CRC16_DECT_R => Ok(CrcAlgorithm::Crc16DectR),
18
            NAME_CRC16_DECT_X => Ok(CrcAlgorithm::Crc16DectX),
19
            NAME_CRC16_DNP => Ok(CrcAlgorithm::Crc16Dnp),
20
            NAME_CRC16_EN_13757 => Ok(CrcAlgorithm::Crc16En13757),
21
            NAME_CRC16_GENIBUS => Ok(CrcAlgorithm::Crc16Genibus),
22
            NAME_CRC16_GSM => Ok(CrcAlgorithm::Crc16Gsm),
23
            NAME_CRC16_IBM_3740 => Ok(CrcAlgorithm::Crc16Ibm3740),
24
            NAME_CRC16_IBM_SDLC => Ok(CrcAlgorithm::Crc16IbmSdlc),
25
            NAME_CRC16_ISO_IEC_14443_3_A => Ok(CrcAlgorithm::Crc16IsoIec144433A),
26
            NAME_CRC16_KERMIT => Ok(CrcAlgorithm::Crc16Kermit),
27
            NAME_CRC16_LJ1200 => Ok(CrcAlgorithm::Crc16Lj1200),
28
            NAME_CRC16_M17 => Ok(CrcAlgorithm::Crc16M17),
29
            NAME_CRC16_MAXIM_DOW => Ok(CrcAlgorithm::Crc16MaximDow),
30
            NAME_CRC16_MCRF4XX => Ok(CrcAlgorithm::Crc16Mcrf4xx),
31
            NAME_CRC16_MODBUS => Ok(CrcAlgorithm::Crc16Modbus),
32
            NAME_CRC16_NRSC_5 => Ok(CrcAlgorithm::Crc16Nrsc5),
33
            NAME_CRC16_OPENSAFETY_A => Ok(CrcAlgorithm::Crc16OpensafetyA),
34
            NAME_CRC16_OPENSAFETY_B => Ok(CrcAlgorithm::Crc16OpensafetyB),
35
            NAME_CRC16_PROFIBUS => Ok(CrcAlgorithm::Crc16Profibus),
36
            NAME_CRC16_RIELLO => Ok(CrcAlgorithm::Crc16Riello),
37
            NAME_CRC16_SPI_FUJITSU => Ok(CrcAlgorithm::Crc16SpiFujitsu),
38
            NAME_CRC16_T10_DIF => Ok(CrcAlgorithm::Crc16T10Dif),
39
            NAME_CRC16_TELEDISK => Ok(CrcAlgorithm::Crc16Teledisk),
40
            NAME_CRC16_TMS37157 => Ok(CrcAlgorithm::Crc16Tms37157),
41
            NAME_CRC16_UMTS => Ok(CrcAlgorithm::Crc16Umts),
42
            NAME_CRC16_USB => Ok(CrcAlgorithm::Crc16Usb),
43
            NAME_CRC16_XMODEM => Ok(CrcAlgorithm::Crc16Xmodem),
44
            NAME_CRC32_AIXM => Ok(CrcAlgorithm::Crc32Aixm),
45
            NAME_CRC32_AUTOSAR => Ok(CrcAlgorithm::Crc32Autosar),
46
            NAME_CRC32_BASE91_D => Ok(CrcAlgorithm::Crc32Base91D),
47
            NAME_CRC32_BZIP2 => Ok(CrcAlgorithm::Crc32Bzip2),
48
            NAME_CRC32_CD_ROM_EDC => Ok(CrcAlgorithm::Crc32CdRomEdc),
49
            NAME_CRC32_CKSUM => Ok(CrcAlgorithm::Crc32Cksum),
50
            NAME_CRC32_ISCSI => Ok(CrcAlgorithm::Crc32Iscsi),
51
            NAME_CRC32_ISO_HDLC => Ok(CrcAlgorithm::Crc32IsoHdlc),
52
            NAME_CRC32_JAMCRC => Ok(CrcAlgorithm::Crc32Jamcrc),
53
            NAME_CRC32_MEF => Ok(CrcAlgorithm::Crc32Mef),
54
            NAME_CRC32_MPEG_2 => Ok(CrcAlgorithm::Crc32Mpeg2),
55
            NAME_CRC32_XFER => Ok(CrcAlgorithm::Crc32Xfer),
56
            NAME_CRC64_GO_ISO => Ok(CrcAlgorithm::Crc64GoIso),
57
            NAME_CRC64_MS => Ok(CrcAlgorithm::Crc64Ms),
58
            NAME_CRC64_NVME => Ok(CrcAlgorithm::Crc64Nvme),
59
            NAME_CRC64_REDIS => Ok(CrcAlgorithm::Crc64Redis),
60
            NAME_CRC64_XZ => Ok(CrcAlgorithm::Crc64Xz),
61
            NAME_CRC64_ECMA_182 => Ok(CrcAlgorithm::Crc64Ecma182),
62
            NAME_CRC64_WE => Ok(CrcAlgorithm::Crc64We),
63
            _ => Err(()),
64
        }
65
    }
66
}
67
68
#[allow(deprecated)]
69
impl Display for CrcAlgorithm {
70
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
71
        match self {
72
            CrcAlgorithm::Crc16Arc => write!(f, "{NAME_CRC16_ARC}"),
73
            CrcAlgorithm::Crc16Cdma2000 => write!(f, "{NAME_CRC16_CDMA2000}"),
74
            CrcAlgorithm::Crc16Cms => write!(f, "{NAME_CRC16_CMS}"),
75
            CrcAlgorithm::Crc16Dds110 => write!(f, "{NAME_CRC16_DDS_110}"),
76
            CrcAlgorithm::Crc16DectR => write!(f, "{NAME_CRC16_DECT_R}"),
77
            CrcAlgorithm::Crc16DectX => write!(f, "{NAME_CRC16_DECT_X}"),
78
            CrcAlgorithm::Crc16Dnp => write!(f, "{NAME_CRC16_DNP}"),
79
            CrcAlgorithm::Crc16En13757 => write!(f, "{NAME_CRC16_EN_13757}"),
80
            CrcAlgorithm::Crc16Genibus => write!(f, "{NAME_CRC16_GENIBUS}"),
81
            CrcAlgorithm::Crc16Gsm => write!(f, "{NAME_CRC16_GSM}"),
82
            CrcAlgorithm::Crc16Ibm3740 => write!(f, "{NAME_CRC16_IBM_3740}",),
83
            CrcAlgorithm::Crc16IbmSdlc => write!(f, "{NAME_CRC16_IBM_SDLC}",),
84
            CrcAlgorithm::Crc16IsoIec144433A => {
85
                write!(f, "{NAME_CRC16_ISO_IEC_14443_3_A}",)
86
            }
87
            CrcAlgorithm::Crc16Kermit => write!(f, "{NAME_CRC16_KERMIT}"),
88
            CrcAlgorithm::Crc16Lj1200 => write!(f, "{NAME_CRC16_LJ1200}"),
89
            CrcAlgorithm::Crc16M17 => write!(f, "{NAME_CRC16_M17}"),
90
            CrcAlgorithm::Crc16MaximDow => write!(f, "{NAME_CRC16_MAXIM_DOW}"),
91
            CrcAlgorithm::Crc16Mcrf4xx => write!(f, "{NAME_CRC16_MCRF4XX}"),
92
            CrcAlgorithm::Crc16Modbus => write!(f, "{NAME_CRC16_MODBUS}"),
93
            CrcAlgorithm::Crc16Nrsc5 => write!(f, "{NAME_CRC16_NRSC_5}"),
94
            CrcAlgorithm::Crc16OpensafetyA => write!(f, "{NAME_CRC16_OPENSAFETY_A}"),
95
            CrcAlgorithm::Crc16OpensafetyB => write!(f, "{NAME_CRC16_OPENSAFETY_B}"),
96
            CrcAlgorithm::Crc16Profibus => write!(f, "{NAME_CRC16_PROFIBUS}"),
97
            CrcAlgorithm::Crc16Riello => write!(f, "{NAME_CRC16_RIELLO}"),
98
            CrcAlgorithm::Crc16SpiFujitsu => write!(f, "{NAME_CRC16_SPI_FUJITSU}"),
99
            CrcAlgorithm::Crc16T10Dif => write!(f, "{NAME_CRC16_T10_DIF}",),
100
            CrcAlgorithm::Crc16Teledisk => write!(f, "{NAME_CRC16_TELEDISK}"),
101
            CrcAlgorithm::Crc16Tms37157 => write!(f, "{NAME_CRC16_TMS37157}"),
102
            CrcAlgorithm::Crc16Umts => write!(f, "{NAME_CRC16_UMTS}"),
103
            CrcAlgorithm::Crc16Usb => write!(f, "{NAME_CRC16_USB}"),
104
            CrcAlgorithm::Crc16Xmodem => write!(f, "{NAME_CRC16_XMODEM}"),
105
            CrcAlgorithm::Crc32Aixm => write!(f, "{NAME_CRC32_AIXM}",),
106
            CrcAlgorithm::Crc32Autosar => write!(f, "{NAME_CRC32_AUTOSAR}",),
107
            CrcAlgorithm::Crc32Base91D => write!(f, "{NAME_CRC32_BASE91_D}",),
108
            CrcAlgorithm::Crc32Bzip2 => write!(f, "{NAME_CRC32_BZIP2}",),
109
            CrcAlgorithm::Crc32CdRomEdc => write!(f, "{NAME_CRC32_CD_ROM_EDC}",),
110
            CrcAlgorithm::Crc32Cksum => write!(f, "{NAME_CRC32_CKSUM}",),
111
            CrcAlgorithm::Crc32Custom => write!(f, "CRC-32/CUSTOM"),
112
            CrcAlgorithm::Crc32Iscsi => write!(f, "{NAME_CRC32_ISCSI}",),
113
            CrcAlgorithm::Crc32IsoHdlc => write!(f, "{NAME_CRC32_ISO_HDLC}",),
114
            CrcAlgorithm::Crc32Jamcrc => write!(f, "{NAME_CRC32_JAMCRC}",),
115
            CrcAlgorithm::Crc32Mef => write!(f, "{NAME_CRC32_MEF}",),
116
            CrcAlgorithm::Crc32Mpeg2 => write!(f, "{NAME_CRC32_MPEG_2}",),
117
            CrcAlgorithm::Crc32Xfer => write!(f, "{NAME_CRC32_XFER}",),
118
            CrcAlgorithm::CrcCustom => write!(f, "CRC/CUSTOM"),
119
            CrcAlgorithm::Crc64Custom => write!(f, "CRC-64/CUSTOM"),
120
            CrcAlgorithm::Crc64GoIso => write!(f, "{NAME_CRC64_GO_ISO}",),
121
            CrcAlgorithm::Crc64Ms => write!(f, "{NAME_CRC64_MS}",),
122
            CrcAlgorithm::Crc64Nvme => write!(f, "{NAME_CRC64_NVME}",),
123
            CrcAlgorithm::Crc64Redis => write!(f, "{NAME_CRC64_REDIS}",),
124
            CrcAlgorithm::Crc64Xz => write!(f, "{NAME_CRC64_XZ}",),
125
            CrcAlgorithm::Crc64Ecma182 => write!(f, "{NAME_CRC64_ECMA_182}",),
126
            CrcAlgorithm::Crc64We => write!(f, "{NAME_CRC64_WE}",),
127
        }
128
    }
129
}
130
131
#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
132
#[derive(Debug, Copy, Clone)]
133
pub(crate) enum Reflector<T> {
134
    NoReflector,
135
    ForwardReflector { smask: T },
136
}
137
138
#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
139
/// Different processing strategies based on data length
140
pub(crate) enum DataChunkProcessor {
141
    From0To15,   // 0-15 bytes
142
    From16,      // exactly 16 bytes
143
    From17To31,  // 17-31 bytes
144
    From32To255, // 32-255 bytes
145
}
146
147
#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
148
impl DataChunkProcessor {
149
    /// Select the appropriate processor based on data length
150
    pub fn for_length(len: usize) -> Self {
151
        match len {
152
            0..=15 => Self::From0To15,
153
            16 => Self::From16,
154
            17..=31 => Self::From17To31,
155
            32..=255 => Self::From32To255,
156
            _ => panic!("data length too large"),
157
        }
158
    }
159
}