1 #ifndef __COMPRESSION_HUFFMANENCODER_H 2 #define __COMPRESSION_HUFFMANENCODER_H 3 4 namespace NCompression { 5 namespace NHuffman { 6 7 const int kNumBitsInLongestCode = 15; 8 9 struct CItem 10 { 11 UINT32 Freq; 12 UINT32 Code; 13 UINT32 Dad; 14 UINT32 Len; 15 }; 16 17 class CEncoder 18 { 19 UINT32 m_NumSymbols; // number of symbols in adwSymbol 20 21 CItem *m_Items; 22 UINT32 *m_Heap; 23 UINT32 m_HeapSize; 24 BYTE *m_Depth; 25 const BYTE *m_ExtraBits; 26 UINT32 m_ExtraBase; 27 UINT32 m_MaxLength; 28 29 UINT32 m_HeapLength; 30 UINT32 m_BitLenCounters[kNumBitsInLongestCode + 1]; 31 32 UINT32 RemoveSmallest(); 33 bool Smaller(int n, int m); 34 void DownHeap(UINT32 k); 35 void GenerateBitLen(UINT32 aMaxCode, UINT32 aHeapMax); 36 void GenerateCodes(UINT32 aMaxCode); 37 38 UINT32 m_BlockBitLength; 39 public: 40 41 CEncoder(UINT32 aNumSymbols, const BYTE *anExtraBits, 42 UINT32 anExtraBase, UINT32 aMaxLength); 43 ~CEncoder(); 44 void StartNewBlock(); 45 AddSymbol(UINT32 aSymbol)46 void AddSymbol(UINT32 aSymbol) 47 { m_Items[aSymbol].Freq++; } 48 49 void SetFreqs(const UINT32 *aFreqs); 50 void BuildTree(BYTE *aLevels); GetBlockBitLength()51 DWORD GetBlockBitLength() const { return m_BlockBitLength; } 52 53 template <class TBitEncoder> CodeOneValue(TBitEncoder * aStream,UINT32 aSymbol)54 void CodeOneValue(TBitEncoder *aStream, UINT32 aSymbol) 55 { aStream->WriteBits(m_Items[aSymbol].Code, m_Items[aSymbol].Len); } 56 }; 57 58 }} 59 60 #endif 61