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