/* * Shared code for compression libraries * (C) 2014 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_COMPRESSION_UTILS_H__ #define BOTAN_COMPRESSION_UTILS_H__ #include #include #include #include namespace Botan { /* * Allocation Size Tracking Helper for Zlib/Bzlib/LZMA */ class Compression_Alloc_Info { public: template static void* malloc(void* self, T n, T size) { return static_cast(self)->do_malloc(n, size); } static void free(void* self, void* ptr) { static_cast(self)->do_free(ptr); } private: void* do_malloc(size_t n, size_t size); void do_free(void* ptr); std::unordered_map m_current_allocs; }; /** * Wrapper for Zlib/Bzlib/LZMA stream types */ template class Zlib_Style_Stream : public Compression_Stream { public: void next_in(byte* b, size_t len) override { m_stream.next_in = reinterpret_cast(b); m_stream.avail_in = len; } void next_out(byte* b, size_t len) override { m_stream.next_out = reinterpret_cast(b); m_stream.avail_out = len; } size_t avail_in() const override { return m_stream.avail_in; } size_t avail_out() const override { return m_stream.avail_out; } Zlib_Style_Stream() { std::memset(&m_stream, 0, sizeof(stream_t)); m_allocs.reset(new Compression_Alloc_Info); } ~Zlib_Style_Stream() { std::memset(&m_stream, 0, sizeof(stream_t)); m_allocs.reset(); } protected: typedef Stream stream_t; stream_t* streamp() { return &m_stream; } Compression_Alloc_Info* alloc() { return m_allocs.get(); } private: stream_t m_stream; std::unique_ptr m_allocs; }; } #endif