#include <core/exceptions.hpp>
+#include <zstd.h>
+
#include <algorithm>
namespace compression {
ZstdCompressor::ZstdCompressor(FILE* const stream, int8_t compression_level)
: m_stream(stream),
- m_zstd_stream(ZSTD_createCStream())
+ m_zstd_stream(ZSTD_createCStream()),
+ m_zstd_in(std::make_unique<ZSTD_inBuffer_s>()),
+ m_zstd_out(std::make_unique<ZSTD_outBuffer_s>())
{
if (compression_level == 0) {
compression_level = default_compression_level;
void
ZstdCompressor::write(const void* const data, const size_t count)
{
- m_zstd_in.src = data;
- m_zstd_in.size = count;
- m_zstd_in.pos = 0;
+ m_zstd_in->src = data;
+ m_zstd_in->size = count;
+ m_zstd_in->pos = 0;
int flush = data ? 0 : 1;
size_t ret;
- while (m_zstd_in.pos < m_zstd_in.size) {
+ while (m_zstd_in->pos < m_zstd_in->size) {
uint8_t buffer[CCACHE_READ_BUFFER_SIZE];
- m_zstd_out.dst = buffer;
- m_zstd_out.size = sizeof(buffer);
- m_zstd_out.pos = 0;
- ret = ZSTD_compressStream(m_zstd_stream, &m_zstd_out, &m_zstd_in);
+ m_zstd_out->dst = buffer;
+ m_zstd_out->size = sizeof(buffer);
+ m_zstd_out->pos = 0;
+ ret = ZSTD_compressStream(m_zstd_stream, m_zstd_out.get(), m_zstd_in.get());
ASSERT(!(ZSTD_isError(ret)));
- const size_t compressed_bytes = m_zstd_out.pos;
+ const size_t compressed_bytes = m_zstd_out->pos;
if (fwrite(buffer, 1, compressed_bytes, m_stream) != compressed_bytes
|| ferror(m_stream)) {
throw core::Error("failed to write to zstd output stream ");
ret = flush;
while (ret > 0) {
uint8_t buffer[CCACHE_READ_BUFFER_SIZE];
- m_zstd_out.dst = buffer;
- m_zstd_out.size = sizeof(buffer);
- m_zstd_out.pos = 0;
- ret = ZSTD_endStream(m_zstd_stream, &m_zstd_out);
- const size_t compressed_bytes = m_zstd_out.pos;
+ m_zstd_out->dst = buffer;
+ m_zstd_out->size = sizeof(buffer);
+ m_zstd_out->pos = 0;
+ ret = ZSTD_endStream(m_zstd_stream, m_zstd_out.get());
+ const size_t compressed_bytes = m_zstd_out->pos;
if (fwrite(buffer, 1, compressed_bytes, m_stream) != compressed_bytes
|| ferror(m_stream)) {
throw core::Error("failed to write to zstd output stream");
#include <NonCopyable.hpp>
-#include <zstd.h>
-
#include <cstdint>
+#include <memory>
+
+struct ZSTD_CCtx_s;
+struct ZSTD_inBuffer_s;
+struct ZSTD_outBuffer_s;
namespace compression {
private:
FILE* m_stream;
- ZSTD_CStream* m_zstd_stream;
- ZSTD_inBuffer m_zstd_in;
- ZSTD_outBuffer m_zstd_out;
+ ZSTD_CCtx_s* m_zstd_stream;
+ std::unique_ptr<ZSTD_inBuffer_s> m_zstd_in;
+ std::unique_ptr<ZSTD_outBuffer_s> m_zstd_out;
int8_t m_compression_level;
};