11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
18PROMEKI_NAMESPACE_BEGIN
63template <
typename T>
class CRC {
65 static_assert(std::is_same_v<T, uint8_t> || std::is_same_v<T, uint16_t> ||
66 std::is_same_v<T, uint32_t> || std::is_same_v<T, uint64_t>,
67 "CRC<T> requires T = uint8_t / uint16_t / uint32_t / uint64_t");
73 static constexpr int Width =
static_cast<int>(
sizeof(T) * 8);
95 explicit CRC(
const Params ¶ms);
105 void update(
const void *data,
size_t len);
132 static T compute(
const Params ¶ms,
const void *data,
size_t len);
135 const Params ¶ms()
const {
return _params; }
145extern template class CRC<uint8_t>;
146extern template class CRC<uint16_t>;
147extern template class CRC<uint32_t>;
148extern template class CRC<uint64_t>;
151using Crc8 = CRC<uint8_t>;
153using Crc16 = CRC<uint16_t>;
155using Crc32 = CRC<uint32_t>;
157using Crc64 = CRC<uint64_t>;
172 inline constexpr Crc8::Params Crc8Smbus{0x07, 0x00, 0x00,
false,
"CRC-8/SMBus"};
175 inline constexpr Crc8::Params Crc8Autosar{0x2F, 0xFF, 0xFF,
false,
"CRC-8/AUTOSAR"};
177 inline constexpr Crc8::Params Crc8Bluetooth{0xA7, 0x00, 0x00,
true,
"CRC-8/Bluetooth"};
181 inline constexpr Crc16::Params Crc16CcittFalse{0x1021, 0xFFFF, 0x0000,
false,
"CRC-16/CCITT-FALSE"};
183 inline constexpr Crc16::Params Crc16Kermit{0x1021, 0x0000, 0x0000,
true,
"CRC-16/Kermit"};
187 inline constexpr Crc32::Params Crc32IsoHdlc{0x04C11DB7u, 0xFFFFFFFFu, 0xFFFFFFFFu,
true,
"CRC-32/ISO-HDLC"};
189 inline constexpr Crc32::Params Crc32Bzip2{0x04C11DB7u, 0xFFFFFFFFu, 0xFFFFFFFFu,
false,
"CRC-32/BZIP2"};
194inline Crc8 crc8_smbus() {
195 return Crc8(CrcParams::Crc8Smbus);
198inline Crc8 crc8_autosar() {
199 return Crc8(CrcParams::Crc8Autosar);
202inline Crc16 crc16_ccitt_false() {
203 return Crc16(CrcParams::Crc16CcittFalse);
206inline Crc32 crc32_iso_hdlc() {
207 return Crc32(CrcParams::Crc32IsoHdlc);