| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef _BSDIFF_COMPRESSOR_BUFFER_H_ |
| #define _BSDIFF_COMPRESSOR_BUFFER_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <vector> |
| |
| namespace bsdiff { |
| |
| // An utility class to store the output from a compressor. It has a small |
| // temporary buffer that holds the compressed data every time the compressed |
| // stream has some output. That buffer is then appended to a list of vectors |
| // stored in memory. This approach is more efficient than a simple vector |
| // because it saves some resize / reallocation of memory. And the compressed |
| // data is copied once no matter how many times we fetch output from the |
| // compressor. |
| class CompressorBuffer { |
| public: |
| explicit CompressorBuffer(size_t buffer_size) { |
| comp_buffer_.resize(buffer_size); |
| } |
| |
| size_t buffer_size() { return comp_buffer_.size(); } |
| uint8_t* buffer_data() { return comp_buffer_.data(); } |
| |
| // Concatenate the data in |comp_chunks_| and return the data in the form of |
| // a single vector. |
| const std::vector<uint8_t>& GetCompressedData(); |
| |
| // Add the data in |comp_buffer_| to the end of |comp_chunks_|. |
| void AddDataToChunks(size_t data_size); |
| |
| private: |
| // A list of chunks of compressed data. The final compressed representation is |
| // the concatenation of all the compressed data. |
| std::vector<std::vector<uint8_t>> comp_chunks_; |
| |
| // A concatenated version of the |comp_chunks_|, used to store the compressed |
| // memory after Finish() is called. |
| std::vector<uint8_t> comp_data_; |
| |
| // A temporary compression buffer for multiple calls to Write(). |
| std::vector<uint8_t> comp_buffer_; |
| }; |
| |
| } // namespace bsdiff |
| |
| #endif // _BSDIFF_COMPRESSOR_BUFFER_H_ |