diff options
Diffstat (limited to '')
-rw-r--r-- | src/StringCompression.h | 82 |
1 files changed, 70 insertions, 12 deletions
diff --git a/src/StringCompression.h b/src/StringCompression.h index 10c00a804..c091c27a0 100644 --- a/src/StringCompression.h +++ b/src/StringCompression.h @@ -1,27 +1,85 @@ // StringCompression.h -// Interfaces to the wrapping functions for compression and decompression using AString as their data +// Interfaces to the wrapping functions for compression and decompression -#include "zlib/zlib.h" // Needed for the Z_XXX return values +#pragma once -/** Compresses a_Data into a_Compressed using ZLIB; returns Z_XXX error constants same as zlib's compress2() */ -extern int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed, int a_Factor); +class cByteBuffer; -/** Uncompresses a_Data into a_Uncompressed; returns Z_XXX error constants same as zlib's decompress() */ -extern int UncompressString(const char * a_Data, size_t a_Length, AString & a_Uncompressed, size_t a_UncompressedSize); +struct libdeflate_compressor; +struct libdeflate_decompressor; -/** Compresses a_Data into a_Compressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib */ -extern int CompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Compressed); -/** Uncompresses a_Data into a_Uncompressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib */ -extern int UncompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Uncompressed); -/** Uncompresses a_Data into a_Uncompressed using Inflate; returns Z_OK for success or Z_XXX error constants same as zlib */ -extern int InflateString(const char * a_Data, size_t a_Length, AString & a_Uncompressed); +namespace Compression +{ + /** Contains the result of a compression or extraction operation. */ + struct Result + { + using Static = std::array<std::byte, 128 KiB>; + using Dynamic = std::unique_ptr<std::byte[]>; + + static constexpr size_t StaticCapacity = sizeof(Compression::Result::Static) / sizeof(Compression::Result::Static::value_type); + + /** Returns a view (of type char) of the internal store. */ + std::string_view GetStringView() const; + + /** Returns a view (of type std::byte) of the internal store. */ + ContiguousByteBufferView GetView() const; + + /** A store allocated on either the stack or heap. */ + std::variant<Static, Dynamic> Storage; + + /** The length of valid data in the store. */ + size_t Size; + }; + + /** Contains routines for data compression. */ + class Compressor + { + public: + + /** Creates a new compressor instance with a compression factor [0-12]. */ + Compressor(int CompressionFactor = 6); + ~Compressor(); + + Result CompressGZip(ContiguousByteBufferView Input); + Result CompressZLib(ContiguousByteBufferView Input); + Result CompressZLib(const void * Input, size_t Size); + + private: + + template <auto Algorithm> + Result Compress(const void * Input, size_t Size); + + libdeflate_compressor * m_Handle; + }; + + /** Contains routines for data extraction. */ + class Extractor + { + public: + + /** Creates a new extractor instance. */ + Extractor(); + ~Extractor(); + + Result ExtractGZip(ContiguousByteBufferView Input); + Result ExtractZLib(ContiguousByteBufferView Input); + Result ExtractZLib(ContiguousByteBufferView Input, size_t UncompressedSize); + + private: + + template <auto Algorithm> Result Extract(ContiguousByteBufferView Input); + template <auto Algorithm> Result Extract(ContiguousByteBufferView Input, size_t UncompressedSize); + + libdeflate_decompressor * m_Handle; + }; +} |