blob: 4b06f720d4a08d9d01b6041771ca078343a8e80b [file] [log] [blame]
Tianjie Xu1c26e2e2017-10-26 17:19:41 -07001// Copyright 2017 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef _BSDIFF_COMPRESSOR_BUFFER_H_
6#define _BSDIFF_COMPRESSOR_BUFFER_H_
7
8#include <stddef.h>
9#include <stdint.h>
10
11#include <vector>
12
13namespace bsdiff {
14
15// An utility class to store the output from a compressor. It has a small
16// temporary buffer that holds the compressed data every time the compressed
17// stream has some output. That buffer is then appended to a list of vectors
18// stored in memory. This approach is more efficient than a simple vector
19// because it saves some resize / reallocation of memory. And the compressed
20// data is copied once no matter how many times we fetch output from the
21// compressor.
22class CompressorBuffer {
23 public:
24 explicit CompressorBuffer(size_t buffer_size) {
25 comp_buffer_.resize(buffer_size);
26 }
27
28 size_t buffer_size() { return comp_buffer_.size(); }
29 uint8_t* buffer_data() { return comp_buffer_.data(); }
30
31 // Concatenate the data in |comp_chunks_| and return the data in the form of
32 // a single vector.
33 const std::vector<uint8_t>& GetCompressedData();
34
35 // Add the data in |comp_buffer_| to the end of |comp_chunks_|.
36 void AddDataToChunks(size_t data_size);
37
38 private:
39 // A list of chunks of compressed data. The final compressed representation is
40 // the concatenation of all the compressed data.
41 std::vector<std::vector<uint8_t>> comp_chunks_;
42
43 // A concatenated version of the |comp_chunks_|, used to store the compressed
44 // memory after Finish() is called.
45 std::vector<uint8_t> comp_data_;
46
47 // A temporary compression buffer for multiple calls to Write().
48 std::vector<uint8_t> comp_buffer_;
49};
50
51} // namespace bsdiff
52
53#endif // _BSDIFF_COMPRESSOR_BUFFER_H_