26 template <
size_t Polynomial,
size_t NumTables>
29 std::array<uint32_t, 256 * NumTables>
table = {};
33 for (uint32_t i = 0; i < 256; i++) {
35 r = ((r & 1) * Polynomial) ^ (r >> 1);
36 r = ((r & 1) * Polynomial) ^ (r >> 1);
37 r = ((r & 1) * Polynomial) ^ (r >> 1);
38 r = ((r & 1) * Polynomial) ^ (r >> 1);
39 r = ((r & 1) * Polynomial) ^ (r >> 1);
40 r = ((r & 1) * Polynomial) ^ (r >> 1);
41 r = ((r & 1) * Polynomial) ^ (r >> 1);
42 r = ((r & 1) * Polynomial) ^ (r >> 1);
45 for (
size_t i = 256; i < table.size(); i++) {
46 uint32_t
value = table[i - 256];
47 table[i] = table[value & 0xff] ^ (value >> 8);
57 return (uint32_t(data[0]) << 0) | (uint32_t(data[1]) << 8) | (uint32_t(data[2]) << 16) |
58 (uint32_t(data[3]) << 24);
74 inline uint32_t
crc32Update(
const uint32_t prev,
const std::byte*
const data,
const size_t length) {
78 for (; (
uintptr_t(data + offset) &
alignof(uint32_t)) != 0 && offset < length; offset++) {
79 r = CRC32_TABLE[(r ^ uint8_t(data[offset])) & 0xff] ^ (r >> 8);
81 if (offset == length) {
86 uint32_t remainingBytes = length - offset;
87 for (; remainingBytes >= 8; offset += 8, remainingBytes -= 8) {
90 r = CRC32_TABLE[0 * 256 + ((r2 >> 24) & 0xff)] ^ CRC32_TABLE[1 * 256 + ((r2 >> 16) & 0xff)] ^
91 CRC32_TABLE[2 * 256 + ((r2 >> 8) & 0xff)] ^ CRC32_TABLE[3 * 256 + ((r2 >> 0) & 0xff)] ^
92 CRC32_TABLE[4 * 256 + ((r >> 24) & 0xff)] ^ CRC32_TABLE[5 * 256 + ((r >> 16) & 0xff)] ^
93 CRC32_TABLE[6 * 256 + ((r >> 8) & 0xff)] ^ CRC32_TABLE[7 * 256 + ((r >> 0) & 0xff)];
97 for (; offset < length; offset++) {
98 r = CRC32_TABLE[(r ^ uint8_t(data[offset])) & 0xff] ^ (r >> 8);
105 return crc ^ 0xffffffff;
constexpr uint32_t operator[](size_t index) const
fallback_uintptr uintptr_t
static constexpr CRC32Table< 0xedb88320, 8 > CRC32_TABLE
static constexpr uint32_t CRC32_INIT
uint32_t getUint32LE(const std::byte *data)
std::array< uint32_t, 256 *NumTables > table
uint32_t crc32Final(uint32_t crc)
uint32_t crc32Update(const uint32_t prev, const std::byte *const data, const size_t length)