From 70b0802bea9a25755b351cdd0ef05b00c8cd23cb Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sun, 11 Feb 2024 10:38:13 +0100 Subject: [PATCH] fix: revert "get rid of null_block_decompressor" (fixes gh #193) This reverts commit 0771e8aa7d51994fa83a59d541b4df664ac94662. --- src/dwarfs/compression/null.cpp | 53 +++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/dwarfs/compression/null.cpp b/src/dwarfs/compression/null.cpp index 8025c574..d9bed9b7 100644 --- a/src/dwarfs/compression/null.cpp +++ b/src/dwarfs/compression/null.cpp @@ -61,6 +61,52 @@ class null_block_compressor final : public block_compressor::impl { } }; +class null_block_decompressor final : public block_decompressor::impl { + public: + null_block_decompressor(const uint8_t* data, size_t size, + std::vector& target) + : decompressed_(target) + , data_(data) + , uncompressed_size_(size) { + // TODO: we shouldn't have to copy this to memory at all... + try { + decompressed_.reserve(uncompressed_size_); + } catch (std::bad_alloc const&) { + DWARFS_THROW( + runtime_error, + fmt::format("could not reserve {} bytes for decompressed block", + uncompressed_size_)); + } + } + + compression_type type() const override { return compression_type::NONE; } + + std::optional metadata() const override { return std::nullopt; } + + bool decompress_frame(size_t frame_size) override { + if (decompressed_.size() + frame_size > uncompressed_size_) { + frame_size = uncompressed_size_ - decompressed_.size(); + } + + assert(frame_size > 0); + + size_t offset = decompressed_.size(); + decompressed_.resize(offset + frame_size); + + std::copy(data_ + offset, data_ + offset + frame_size, + &decompressed_[offset]); + + return decompressed_.size() == uncompressed_size_; + } + + size_t uncompressed_size() const override { return uncompressed_size_; } + + private: + std::vector& decompressed_; + const uint8_t* const data_; + const size_t uncompressed_size_; +}; + class null_compression_factory : public compression_factory { public: std::string_view name() const override { return "null"; } @@ -77,9 +123,10 @@ class null_compression_factory : public compression_factory { } std::unique_ptr - make_decompressor(std::span, - std::vector&) const override { - DWARFS_THROW(runtime_error, "null_decompressor not implemented"); + make_decompressor(std::span data, + std::vector& target) const override { + return std::make_unique(data.data(), data.size(), + target); } private: