diff --git a/CMakeLists.txt b/CMakeLists.txt index d26557f..cae52cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ set(headers src/cleanuphelper.h + src/crc32builder.h src/cppflags.h src/cppmacros.h src/cppoverloadutils.h diff --git a/src/crc32builder.h b/src/crc32builder.h new file mode 100644 index 0000000..a7bd555 --- /dev/null +++ b/src/crc32builder.h @@ -0,0 +1,38 @@ +#pragma once + +namespace cpputils { + +class Crc32Builder +{ +public: + std::size_t write(uint8_t c) + { + return write(&c, 1); + } + + std::size_t write(const uint8_t *buf, std::size_t len) + { + auto lenTemp = len; + while (lenTemp--) + { + uint32_t val = (crc ^ * buf++) & 0xFF; + for (uint8_t i = 0; i < 8; i++) + { + val = val & 1 ? (val>>1)^0xEDB88320 : val>>1; + } + crc = val^crc>>8; + } + + return len; + }; + + uint32_t hash() const + { + return crc ^ 0xFFFFFFFF; + } + +private: + uint32_t crc{0xFFFFFFFF}; +}; + +} // namespace cpputils