diff options
author | Yuri Gorshenin <y@maps.me> | 2016-12-08 01:57:10 +0300 |
---|---|---|
committer | Yuri Gorshenin <y@maps.me> | 2016-12-08 02:01:45 +0300 |
commit | d6816bb4ee5fc53f706e243e2e0e52d1d18a463a (patch) | |
tree | 6018dcb41e8cc2893f5d6457d25728daa0b40768 /coding/zlib.cpp | |
parent | fce37cc9a0483aed41aaa15ad5b20ee64bd4c3e0 (diff) |
[coding] ZLib wrappers.
Diffstat (limited to 'coding/zlib.cpp')
-rw-r--r-- | coding/zlib.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/coding/zlib.cpp b/coding/zlib.cpp new file mode 100644 index 0000000000..61979359f4 --- /dev/null +++ b/coding/zlib.cpp @@ -0,0 +1,83 @@ +#include "coding/zlib.hpp" + +namespace coding +{ +namespace +{ +int LevelToInt(ZLib::Level level) +{ + switch (level) + { + case ZLib::Level::NoCompression: return Z_NO_COMPRESSION; + case ZLib::Level::BestSpeed: return Z_BEST_SPEED; + case ZLib::Level::BestCompression: return Z_BEST_COMPRESSION; + case ZLib::Level::DefaultCompression: return Z_DEFAULT_COMPRESSION; + } +} +} // namespace + +// ZLib::Processor --------------------------------------------------------------------------------- +ZLib::Processor::Processor(char const * data, size_t size) : m_init(false) +{ + m_stream.next_in = const_cast<unsigned char *>(reinterpret_cast<unsigned char const *>(data)); + m_stream.avail_in = size; + + m_stream.next_out = reinterpret_cast<unsigned char *>(m_buffer); + m_stream.avail_out = kBufferSize; + + m_stream.zalloc = Z_NULL; + m_stream.zfree = Z_NULL; + m_stream.opaque = Z_NULL; +} + +bool ZLib::Processor::ConsumedAll() const +{ + ASSERT(IsInit(), ()); + return m_stream.avail_in == 0; +} + +bool ZLib::Processor::BufferIsFull() const +{ + ASSERT(IsInit(), ()); + return m_stream.avail_out == 0; +} + +// ZLib::Deflate ----------------------------------------------------------------------------------- +ZLib::DeflateProcessor::DeflateProcessor(char const * data, size_t size, ZLib::Level level) + : Processor(data, size) +{ + int const ret = deflateInit(&m_stream, LevelToInt(level)); + m_init = (ret == Z_OK); +} + +ZLib::DeflateProcessor::~DeflateProcessor() +{ + if (m_init) + deflateEnd(&m_stream); +} + +int ZLib::DeflateProcessor::Process(int flush) +{ + ASSERT(IsInit(), ()); + return deflate(&m_stream, flush); +} + +// ZLib::Inflate ----------------------------------------------------------------------------------- +ZLib::InflateProcessor::InflateProcessor(char const * data, size_t size) : Processor(data, size) +{ + int const ret = inflateInit(&m_stream); + m_init = (ret == Z_OK); +} + +ZLib::InflateProcessor::~InflateProcessor() +{ + if (m_init) + inflateEnd(&m_stream); +} + +int ZLib::InflateProcessor::Process(int flush) +{ + ASSERT(IsInit(), ()); + return inflate(&m_stream, flush); +} +} // namespace coding |