| // 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 SRC_PUFF_DATA_H_ |
| #define SRC_PUFF_DATA_H_ |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <functional> |
| |
| namespace puffin { |
| |
| // Data structure that is exchanged between the |PuffWriterInterface|, |
| // |PuffReaderInterface|, |Puffer|, and |Huffer|. |
| struct PuffData { |
| enum class Type { |
| // Used for reading/writing only one literal. |
| kLiteral, |
| |
| // Used for reading/writing literals. |
| kLiterals, |
| |
| // Used for reading/writing length/distance pairs. |
| kLenDist, |
| |
| // Used for reading/writing a buffer as the Huffman table. The |
| // implementations should copy the data (located in |metadata|) into puff |
| // buffer. |
| kBlockMetadata, |
| |
| // Used for reading/writing an end of block symbol. End of block can |
| // contain the unused bits of data at the end of a deflate stream. |
| kEndOfBlock, |
| } type; |
| |
| // A function that once set, can read raw bytes from whatever its parameters |
| // are set. This function reads |count| bytes from |buffer| and advances its |
| // read offset forward. The next call to this function will start reading |
| // after the last read byte. It returns false if it cannot read or the |count| |
| // is larger than what is availabe in the buffer. |
| // Used by: |
| // PuffData::Type::kLiterals |
| std::function<bool(uint8_t* buffer, size_t count)> read_fn; |
| |
| // Used by: |
| // PuffData::Type::kBlockMetadata |
| // PuffData::Type::kEndOfBlock |
| // PuffData::Type::kLiterals |
| // PuffData::Type::kLenDist |
| size_t length; |
| |
| // Used by: |
| // PuffData::Type::kEndOfBlock |
| // PuffData::Type::kLenDist |
| size_t distance; |
| |
| // Used by: |
| // PuffData::Type::kEndOfBlock |
| // PuffData::Type::kLiteral |
| uint8_t byte; |
| |
| // 1: Header size. |
| // 3: Lengths of next three arrays. |
| // 286: Maximum number of literals/lengths codes lengths. |
| // 30: Maximum number of distance codes lengths. |
| // 19: Maximum number of header code lengths. |
| // Used by: |
| // PuffData::Type::kBlockMetadata |
| uint8_t block_metadata[1 + 3 + 286 + 30 + 19]; |
| }; |
| |
| // The headers for differentiating literals from length/distance pairs. |
| constexpr uint8_t kLiteralsHeader = 0x00; |
| constexpr uint8_t kLenDistHeader = 0x80; |
| |
| } // namespace puffin |
| |
| #endif // SRC_PUFF_DATA_H_ |