You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.8 KiB
54 lines
1.8 KiB
// 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_
|