1#ifndef APE_BITARRAY_H
2#define APE_BITARRAY_H
3
4#include "IO.h"
5#include "MD5.h"
6
7//#define BUILD_RANGE_TABLE
8
9struct RANGE_CODER_STRUCT_COMPRESS
10{
11    unsigned int low;        // low end of interval
12    unsigned int range;        // length of interval
13    unsigned int help;        // bytes_to_follow resp. intermediate value
14    unsigned char buffer;    // buffer for input / output
15};
16
17struct BIT_ARRAY_STATE
18{
19    uint32    k;
20    uint32    nKSum;
21};
22
23class CBitArray
24{
25public:
26
27    // construction / destruction
28    CBitArray(CIO *pIO);
29    ~CBitArray();
30
31    // encoding
32    int EncodeUnsignedLong(unsigned int n);
33    int EncodeValue(int nEncode, BIT_ARRAY_STATE & BitArrayState);
34    int EncodeBits(unsigned int nValue, int nBits);
35
36    // output (saving)
37    int OutputBitArray(BOOL bFinalize = FALSE);
38
39    // other functions
40    void Finalize();
41    void AdvanceToByteBoundary();
42    inline uint32 GetCurrentBitIndex() { return m_nCurrentBitIndex; }
43    void FlushState(BIT_ARRAY_STATE & BitArrayState);
44    void FlushBitArray();
45    inline CMD5Helper & GetMD5Helper() { return m_MD5; }
46
47private:
48
49    // data members
50    uint32 *            m_pBitArray;
51    CIO    *                        m_pIO;
52    uint32            m_nCurrentBitIndex;
53    RANGE_CODER_STRUCT_COMPRESS    m_RangeCoderInfo;
54    CMD5Helper                    m_MD5;
55
56#ifdef BUILD_RANGE_TABLE
57    void OutputRangeTable();
58#endif
59
60};
61
62#endif // #ifndef APE_BITARRAY_H
63