|  | // 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_ |