diff --git a/.gitignore b/.gitignore index e4c99a6..c5a5fba 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ gmon\.out cmake-build-debug/ \.idea/ +*.lzw diff --git a/src/compress.cc b/src/compress.cc index d3a040a..0278200 100644 --- a/src/compress.cc +++ b/src/compress.cc @@ -116,18 +116,18 @@ void compress(const std::string &t_in_file, const char *t_out_file) { // const auto comp_str{lzw_compress(str, dictionary)}; // thread pool - std::vector> threads{}; + std::vector, uvec>> threads{}; // char chunk[32768]; std::vector chunk{}; chunk.reserve(32768); while (input_file.read(chunk.data(), 32768)) { - threads.push_back(std::make_pair(std::thread{}, uvec{})); - threads.back().first = - std::thread{lzw_compress, chunk, ref(threads.back().second)}; + threads.push_back(std::make_pair(nullptr, uvec{})); + threads.back().first = std::make_unique( + std::thread{lzw_compress, chunk, ref(threads.back().second)}); if (threads.size() >= 8) { for (auto &elem : threads) { - elem.first.join(); + (*elem.first).join(); } for (auto &elem : threads) { for (const auto c : elem.second) { @@ -138,6 +138,18 @@ void compress(const std::string &t_in_file, const char *t_out_file) { } } + if(threads.size() != 0) { + for (auto &elem : threads) { + (*elem.first).join(); + } + for (auto &elem : threads) { + for (const auto c : elem.second) { + write_utf8(out, c); + } + } + threads.clear(); + } + if(input_file.tellg() != std::ios::end) { std::puts("Leftovers..."); }