crc_fast/
enums.rs

1// Copyright 2025 Don MacAskill. Licensed under MIT or Apache-2.0.
2
3use crate::consts::*;
4use crate::CrcAlgorithm;
5use core::fmt::{Display, Formatter};
6use core::str::FromStr;
7
8impl 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)]
69impl 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)]
133pub(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
140pub(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"))]
148impl 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}