crc_fast/
enums.rs

1// Copyright 2025 Don MacAskill. Licensed under MIT or Apache-2.0.
2
3use crate::consts::*;
4use crate::CrcAlgorithm;
5use std::fmt::{Display, Formatter};
6use std::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_CRC32_AIXM => Ok(CrcAlgorithm::Crc32Aixm),
14            NAME_CRC32_AUTOSAR => Ok(CrcAlgorithm::Crc32Autosar),
15            NAME_CRC32_BASE91_D => Ok(CrcAlgorithm::Crc32Base91D),
16            NAME_CRC32_BZIP2 => Ok(CrcAlgorithm::Crc32Bzip2),
17            NAME_CRC32_CD_ROM_EDC => Ok(CrcAlgorithm::Crc32CdRomEdc),
18            NAME_CRC32_CKSUM => Ok(CrcAlgorithm::Crc32Cksum),
19            NAME_CRC32_ISCSI => Ok(CrcAlgorithm::Crc32Iscsi),
20            NAME_CRC32_ISO_HDLC => Ok(CrcAlgorithm::Crc32IsoHdlc),
21            NAME_CRC32_JAMCRC => Ok(CrcAlgorithm::Crc32Jamcrc),
22            NAME_CRC32_MEF => Ok(CrcAlgorithm::Crc32Mef),
23            NAME_CRC32_MPEG_2 => Ok(CrcAlgorithm::Crc32Mpeg2),
24            NAME_CRC32_XFER => Ok(CrcAlgorithm::Crc32Xfer),
25            NAME_CRC64_GO_ISO => Ok(CrcAlgorithm::Crc64GoIso),
26            NAME_CRC64_MS => Ok(CrcAlgorithm::Crc64Ms),
27            NAME_CRC64_NVME => Ok(CrcAlgorithm::Crc64Nvme),
28            NAME_CRC64_REDIS => Ok(CrcAlgorithm::Crc64Redis),
29            NAME_CRC64_XZ => Ok(CrcAlgorithm::Crc64Xz),
30            NAME_CRC64_ECMA_182 => Ok(CrcAlgorithm::Crc64Ecma182),
31            NAME_CRC64_WE => Ok(CrcAlgorithm::Crc64We),
32            _ => Err(()),
33        }
34    }
35}
36
37impl Display for CrcAlgorithm {
38    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
39        match self {
40            CrcAlgorithm::Crc32Aixm => write!(f, "{}", NAME_CRC32_AIXM),
41            CrcAlgorithm::Crc32Autosar => write!(f, "{}", NAME_CRC32_AUTOSAR),
42            CrcAlgorithm::Crc32Base91D => write!(f, "{}", NAME_CRC32_BASE91_D),
43            CrcAlgorithm::Crc32Bzip2 => write!(f, "{}", NAME_CRC32_BZIP2),
44            CrcAlgorithm::Crc32CdRomEdc => write!(f, "{}", NAME_CRC32_CD_ROM_EDC),
45            CrcAlgorithm::Crc32Cksum => write!(f, "{}", NAME_CRC32_CKSUM),
46            CrcAlgorithm::Crc32Iscsi => write!(f, "{}", NAME_CRC32_ISCSI),
47            CrcAlgorithm::Crc32IsoHdlc => write!(f, "{}", NAME_CRC32_ISO_HDLC),
48            CrcAlgorithm::Crc32Jamcrc => write!(f, "{}", NAME_CRC32_JAMCRC),
49            CrcAlgorithm::Crc32Mef => write!(f, "{}", NAME_CRC32_MEF),
50            CrcAlgorithm::Crc32Mpeg2 => write!(f, "{}", NAME_CRC32_MPEG_2),
51            CrcAlgorithm::Crc32Xfer => write!(f, "{}", NAME_CRC32_XFER),
52            CrcAlgorithm::Crc64GoIso => write!(f, "{}", NAME_CRC64_GO_ISO),
53            CrcAlgorithm::Crc64Ms => write!(f, "{}", NAME_CRC64_MS),
54            CrcAlgorithm::Crc64Nvme => write!(f, "{}", NAME_CRC64_NVME),
55            CrcAlgorithm::Crc64Redis => write!(f, "{}", NAME_CRC64_REDIS),
56            CrcAlgorithm::Crc64Xz => write!(f, "{}", NAME_CRC64_XZ),
57            CrcAlgorithm::Crc64Ecma182 => write!(f, "{}", NAME_CRC64_ECMA_182),
58            CrcAlgorithm::Crc64We => write!(f, "{}", NAME_CRC64_WE),
59        }
60    }
61}
62
63#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
64#[derive(Debug, Copy, Clone)]
65pub(crate) enum Reflector<T> {
66    NoReflector,
67    ForwardReflector { smask: T },
68}
69
70#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
71/// Different processing strategies based on data length
72pub(crate) enum DataChunkProcessor {
73    From0To15,   // 0-15 bytes
74    From16,      // exactly 16 bytes
75    From17To31,  // 17-31 bytes
76    From32To255, // 32-255 bytes
77}
78
79#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
80impl DataChunkProcessor {
81    /// Select the appropriate processor based on data length
82    pub fn for_length(len: usize) -> Self {
83        match len {
84            0..=15 => Self::From0To15,
85            16 => Self::From16,
86            17..=31 => Self::From17To31,
87            32..=255 => Self::From32To255,
88            _ => panic!("data length too large"),
89        }
90    }
91}