Skip to content

Commit

Permalink
fix bug with copy constructors
Browse files Browse the repository at this point in the history
  • Loading branch information
cldellow committed Oct 6, 2024
1 parent 86dffe5 commit 4f379b7
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/helpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,21 @@ class Compressor {
libdeflate_compressor* compressor;

Compressor(int level): level(level), compressor(NULL) {
setLevel(level);
}

void setLevel(int level) {
libdeflate_free_compressor(compressor);
this->level = level;
compressor = libdeflate_alloc_compressor(level);

if (!compressor)
throw std::runtime_error("libdeflate_alloc_compressor failed (level=" + std::to_string(level) + ")");
}

Compressor & operator=(const Compressor&) = delete;
Compressor(const Compressor&) = delete;

~Compressor() {
libdeflate_free_compressor(compressor);
}
Expand All @@ -52,13 +61,16 @@ class Decompressor {
throw std::runtime_error("libdeflate_alloc_decompressor failed");
}

Decompressor & operator=(const Decompressor&) = delete;
Decompressor(const Decompressor&) = delete;

~Decompressor() {
libdeflate_free_decompressor(decompressor);
}
};


thread_local Compressor compressor(6);
thread_local Compressor compressor(9);
thread_local Decompressor decompressor;

std::string compress_string(const std::string& str,
Expand All @@ -68,14 +80,14 @@ std::string compress_string(const std::string& str,
compressionlevel = 6;

if (compressionlevel != compressor.level)
compressor = Compressor(compressionlevel);
compressor.setLevel(compressionlevel);

std::string rv;
if (asGzip) {
size_t maxSize = libdeflate_gzip_compress_bound(compressor.compressor, str.size());
rv.resize(maxSize);

//std::cout << "compressing str with size " << std::to_string(str.size()) << " maxSize=" << std::to_string(maxSize) << " rv.size()=" << std::to_string(rv.size()) << std::endl;
//std::cout << "compressing str with level " << std::to_string(compressionlevel) << " size " << std::to_string(str.size()) << " maxSize=" << std::to_string(maxSize) << " rv.size()=" << std::to_string(rv.size()) << std::endl;
size_t compressedSize = libdeflate_gzip_compress(compressor.compressor, str.data(), str.size(), &rv[0], maxSize);
if (compressedSize == 0)
throw std::runtime_error("libdeflate_gzip_compress failed");
Expand Down

0 comments on commit 4f379b7

Please sign in to comment.