diff --git a/lix/libutil/compression.cc b/lix/libutil/compression.cc index 7e63b6fca..89ad2b444 100644 --- a/lix/libutil/compression.cc +++ b/lix/libutil/compression.cc @@ -55,13 +55,13 @@ struct ChunkedCompressionSink : CompressionSink struct ArchiveDecompressionSource : Source { std::unique_ptr archive = 0; - Source & src; - ArchiveDecompressionSource(Source & src) : src(src) {} + std::unique_ptr src; + ArchiveDecompressionSource(std::unique_ptr src) : src(std::move(src)) {} ~ArchiveDecompressionSource() override {} size_t read(char * data, size_t len) override { struct archive_entry * ae; if (!archive) { - archive = std::make_unique(src, true); + archive = std::make_unique(*src, true); this->archive->check(archive_read_next_header(this->archive->archive, &ae), "failed to read header (%s)"); if (archive_filter_count(this->archive->archive) < 2) { @@ -163,14 +163,15 @@ struct BrotliDecompressionSource : Source const uint8_t * next_in; std::exception_ptr inputEofException = nullptr; - Source * inner; + std::unique_ptr inner; std::unique_ptr state; - BrotliDecompressionSource(Source & inner) + BrotliDecompressionSource(std::unique_ptr inner) : buf(std::make_unique(BUF_SIZE)) - , inner(&inner) + , inner(std::move(inner)) , state{ - BrotliDecoderCreateInstance(nullptr, nullptr, nullptr), BrotliDecoderDestroyInstance} + BrotliDecoderCreateInstance(nullptr, nullptr, nullptr), BrotliDecoderDestroyInstance + } { if (!state) { throw CompressionError("unable to initialize brotli decoder"); @@ -231,21 +232,19 @@ finish: std::string decompress(const std::string & method, std::string_view in) { - StringSource src{in}; - auto filter = makeDecompressionSource(method, src); + auto filter = makeDecompressionSource(method, std::make_unique(in)); return filter->drain(); } -std::unique_ptr makeDecompressionSource(const std::string & method, Source & inner) +std::unique_ptr +makeDecompressionSource(const std::string & method, std::unique_ptr inner) { if (method == "none" || method == "") { - return std::make_unique([&](char * data, size_t len) { - return inner.read(data, len); - }); + return inner; } else if (method == "br") { - return std::make_unique(inner); + return std::make_unique(std::move(inner)); } else { - return std::make_unique(inner); + return std::make_unique(std::move(inner)); } } @@ -288,7 +287,6 @@ struct DecompressorPipes struct DecompressionStream : DecompressorPipes, AsyncInputStream { box_ptr inner; - std::unique_ptr source; std::unique_ptr sink; std::unique_ptr decompressor; std::future thread; @@ -301,9 +299,9 @@ struct DecompressionStream : DecompressorPipes, AsyncInputStream makeNonBlocking(compressed.writeSide.get()); makeNonBlocking(uncompressed.readSide.get()); - source = std::make_unique(compressed.readSide.get()); sink = std::make_unique(uncompressed.writeSide.get()); - decompressor = makeDecompressionSource(method, *source); + decompressor = + makeDecompressionSource(method, std::make_unique(compressed.readSide.get())); thread = std::async(std::launch::async, [&] { // signal the feeder and reader when we're done diff --git a/lix/libutil/compression.hh b/lix/libutil/compression.hh index b1170021e..ccf2b21b8 100644 --- a/lix/libutil/compression.hh +++ b/lix/libutil/compression.hh @@ -7,6 +7,7 @@ #include "lix/libutil/types.hh" #include "lix/libutil/serialise.hh" +#include #include namespace nix { @@ -20,7 +21,8 @@ struct CompressionSink : BufferedSink, FinishSink std::string decompress(const std::string & method, std::string_view in); -std::unique_ptr makeDecompressionSource(const std::string & method, Source & inner); +std::unique_ptr +makeDecompressionSource(const std::string & method, std::unique_ptr inner); box_ptr makeDecompressionStream(const std::string & method, box_ptr inner); diff --git a/tests/unit/libutil/compression.cc b/tests/unit/libutil/compression.cc index dfdd7dab4..6a2c6dfcb 100644 --- a/tests/unit/libutil/compression.cc +++ b/tests/unit/libutil/compression.cc @@ -2,8 +2,10 @@ #include "lix/libutil/async-io.hh" #include "lix/libutil/async.hh" #include "lix/libutil/box_ptr.hh" +#include "lix/libutil/serialise.hh" #include #include +#include namespace nix { @@ -123,8 +125,8 @@ TEST_P(PerTypeCompressionTest, sinkAndSource) (*sink)(inputString); sink->finish(); - StringSource strSource{strSink.s}; - auto decompressionSource = makeDecompressionSource(method, strSource); + auto decompressionSource = + makeDecompressionSource(method, std::make_unique(strSink.s)); ASSERT_STREQ(decompressionSource->drain().c_str(), inputString); }