libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
crc.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <cstddef>
14#include <cstdint>
15#include <type_traits>
16#include <promeki/namespace.h>
17
18PROMEKI_NAMESPACE_BEGIN
19
63template <typename T> class CRC {
64 public:
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");
68
70 using Value = T;
71
73 static constexpr int Width = static_cast<int>(sizeof(T) * 8);
74
83 struct Params {
84 T poly;
85 T init;
86 T xorOut;
87 bool reflect;
88 const char *name;
89 };
90
95 explicit CRC(const Params &params);
96
98 void reset();
99
105 void update(const void *data, size_t len);
106
115 T value() const;
116
132 static T compute(const Params &params, const void *data, size_t len);
133
135 const Params &params() const { return _params; }
136
137 private:
138 void buildTable();
139
140 Params _params{};
141 T _table[256]{};
142 T _crc{};
143};
144
145extern template class CRC<uint8_t>;
146extern template class CRC<uint16_t>;
147extern template class CRC<uint32_t>;
148extern template class CRC<uint64_t>;
149
151using Crc8 = CRC<uint8_t>;
153using Crc16 = CRC<uint16_t>;
155using Crc32 = CRC<uint32_t>;
157using Crc64 = CRC<uint64_t>;
158
169namespace CrcParams {
170
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"};
178
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"};
184
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"};
190
191} // namespace CrcParams
192
194inline Crc8 crc8_smbus() {
195 return Crc8(CrcParams::Crc8Smbus);
196}
198inline Crc8 crc8_autosar() {
199 return Crc8(CrcParams::Crc8Autosar);
200}
202inline Crc16 crc16_ccitt_false() {
203 return Crc16(CrcParams::Crc16CcittFalse);
204}
206inline Crc32 crc32_iso_hdlc() {
207 return Crc32(CrcParams::Crc32IsoHdlc);
208}
209
210PROMEKI_NAMESPACE_END
211
212#endif // PROMEKI_ENABLE_CORE