#pragma once #include "HuffmanTree.h" #include #include #include class BitStream; class HuffmanCodeLengthTable { public: void buildPrefixCodes(); void buildCompressedLengthSequence(); std::string dumpPrefixCodes() const; std::optional findMatch(std::size_t treeIndex, uint32_t code) const; const HuffmanTree& getTree() const; const PrefixCode& getCode(std::size_t index) const; std::optional getCodeForSymbol(unsigned symbol) const; using CompressedSequenceEntry = std::pair; const std::vector& getCompressedLengthSequence() const; const std::vector getCompressedLengthCounts() const; std::size_t getNumCodeLengths() const; unsigned getCodeLength(std::size_t treeIndex) const; unsigned mapToDeflateIndex(unsigned index) const; void setInputLengthSequence(const std::vector& sequence, bool targetDeflate = true); bool readNextSymbol(unsigned& buffer, BitStream* stream); private: HuffmanTree mTree; bool mTargetDeflate{true}; std::vector mInputLengthSequence; std::vector mCodes; std::vector mCompressedLengthSequence; std::vector mCompressedLengthCounts; static constexpr unsigned DEFLATE_PERMUTATION_SIZE{19}; static constexpr unsigned DEFLATE_PERMUTATION[DEFLATE_PERMUTATION_SIZE]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; };