#pragma once #include "RawTree.h" #include "HuffmanCodeLengthTable.h" #include "HuffmanFixedCodes.h" #include #include #include class PrefixCodeGenerator { public: virtual ~PrefixCodeGenerator() = default; virtual std::optional getLiteralValue(unsigned char symbol) const = 0; virtual std::optional getLengthValue(unsigned length) const = 0; virtual std::optional getDistanceValue(unsigned distance) const = 0; virtual std::optional getEndOfStreamValue() const = 0; }; class HuffmanEncoder : public PrefixCodeGenerator { using CountPair = std::pair; using Hit = std::tuple; public: void encode(const std::vector& counts); void encode(const std::unordered_map& counts); uint32_t getLengthValue(unsigned length); std::optional getLiteralValue(unsigned char symbol) const override; std::optional getLengthValue(unsigned length) const override; std::optional getDistanceValue(unsigned distance) const override; std::optional getEndOfStreamValue() const override; void initializeTrees(const std::vector& hits); void setUseFixedCode(bool useFixed); private: void initializeLiteralLengthTable(const std::vector& hits); void dumpTree(const RawTree& tree) const; void dumpNode(RawNode* node, unsigned depth) const; bool mUseFixedCode{false}; bool mTableIsInitialized{false}; std::vector mSymbolMapping; HuffmanCodeLengthTable mLiteralLengthTable; HuffmanCodeLengthTable mDistanceTable; };