diff --git a/crc32constexper.h b/crc32constexper.h new file mode 100644 index 0000000..d838629 --- /dev/null +++ b/crc32constexper.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2025-2025 QuasarApp. + * Distributed under the lgplv3 software license, see the accompanying + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. +*/ + +#ifndef CRC32CONSTEXPER_H +#define CRC32CONSTEXPER_H + + +#include +#include +#include + +namespace QuasarAppUtils { + +/** + * @brief generateCrc32Table This method generate crc32 table for fast calculate crc32 hash. + * @param polynomial This is polynomial for crc32 hash. + * @return return table for fast calculate crc32 hash. + * @note This method is constexpr and available in compile time. + */ +constexpr std::array generateCrc32Table(uint32_t polynomial = 0xEDB88320) { + std::array table{}; + for (uint32_t i = 0; i < 256; ++i) { + uint32_t crc = i; + for (int j = 0; j < 8; ++j) { + crc = (crc >> 1) ^ (-(crc & 1) & polynomial); + } + table[i] = crc; + } + return table; +} + +/** + * @brief crc32Table This is crc32 table for fast calculate crc32 hash. + * @note This table is used for fast calculate crc32 hash. + */ +constexpr std::array crc32Table = generateCrc32Table(); + +/** + * @brief calculateCrc32 This method calculate crc32 hash for data. + * @param data This is data for calculate crc32 hash. + * @param size This is size of data. + * @param initialCrc This is initial crc value. + * @return return crc32 hash for data. + * @note This method is constexpr and available in compile time. + */ +constexpr uint32_t calculateCrc32(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) { + uint32_t crc = initialCrc; + for (size_t i = 0; i < size; ++i) { + crc = crc32Table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8); + } + return crc ^ 0xFFFFFFFF; +} + +/** + * @brief calculateCrc16 This method calculate crc16 hash for data. + * @param data This is data for calculate crc16 hash. + * @param size This is size of data. + * @param initialCrc This is initial crc value. + * @return return crc16 hash for data. + * @note This method is constexpr and available in compile time. + */ +constexpr uint16_t calculateCrc16(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) { + return calculateCrc32(data, size, initialCrc) % 0xFFFF; +} + +/** + * @brief calculateCrc8 This method calculate crc8 hash for data. + * @param data This is data for calculate crc8 hash. + * @param size This is size of data. + * @param initialCrc This is initial crc value. + * @return return crc8 hash for data. + * @note This method is constexpr and available in compile time. + */ +constexpr uint16_t calculateCrc8(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) { + return calculateCrc32(data, size, initialCrc) % 0xFF; +} +} + +#endif // CRC32CONSTEXPER_H