xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/BitlEncoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // BitlEncoder.h -- the Least Significant Bit of byte is First
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_BITL_ENCODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_BITL_ENCODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/OutBuffer.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker class CBitlEncoder
9*f6dc9357SAndroid Build Coastguard Worker {
10*f6dc9357SAndroid Build Coastguard Worker   COutBuffer _stream;
11*f6dc9357SAndroid Build Coastguard Worker   unsigned _bitPos;
12*f6dc9357SAndroid Build Coastguard Worker   Byte _curByte;
13*f6dc9357SAndroid Build Coastguard Worker public:
Create(UInt32 bufSize)14*f6dc9357SAndroid Build Coastguard Worker   bool Create(UInt32 bufSize) { return _stream.Create(bufSize); }
SetStream(ISequentialOutStream * outStream)15*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialOutStream *outStream) { _stream.SetStream(outStream); }
16*f6dc9357SAndroid Build Coastguard Worker   // unsigned GetBitPosition() const { return (8 - _bitPos); }
GetProcessedSize()17*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetProcessedSize() const { return _stream.GetProcessedSize() + ((8 - _bitPos + 7) >> 3); }
Init()18*f6dc9357SAndroid Build Coastguard Worker   void Init()
19*f6dc9357SAndroid Build Coastguard Worker   {
20*f6dc9357SAndroid Build Coastguard Worker     _stream.Init();
21*f6dc9357SAndroid Build Coastguard Worker     _bitPos = 8;
22*f6dc9357SAndroid Build Coastguard Worker     _curByte = 0;
23*f6dc9357SAndroid Build Coastguard Worker   }
Flush()24*f6dc9357SAndroid Build Coastguard Worker   HRESULT Flush()
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     FlushByte();
27*f6dc9357SAndroid Build Coastguard Worker     return _stream.Flush();
28*f6dc9357SAndroid Build Coastguard Worker   }
FlushByte()29*f6dc9357SAndroid Build Coastguard Worker   void FlushByte()
30*f6dc9357SAndroid Build Coastguard Worker   {
31*f6dc9357SAndroid Build Coastguard Worker     if (_bitPos < 8)
32*f6dc9357SAndroid Build Coastguard Worker       _stream.WriteByte(_curByte);
33*f6dc9357SAndroid Build Coastguard Worker     _bitPos = 8;
34*f6dc9357SAndroid Build Coastguard Worker     _curByte = 0;
35*f6dc9357SAndroid Build Coastguard Worker   }
WriteBits(UInt32 value,unsigned numBits)36*f6dc9357SAndroid Build Coastguard Worker   void WriteBits(UInt32 value, unsigned numBits)
37*f6dc9357SAndroid Build Coastguard Worker   {
38*f6dc9357SAndroid Build Coastguard Worker     while (numBits > 0)
39*f6dc9357SAndroid Build Coastguard Worker     {
40*f6dc9357SAndroid Build Coastguard Worker       if (numBits < _bitPos)
41*f6dc9357SAndroid Build Coastguard Worker       {
42*f6dc9357SAndroid Build Coastguard Worker         _curByte |= (Byte)((value & ((1 << numBits) - 1)) << (8 - _bitPos));
43*f6dc9357SAndroid Build Coastguard Worker         _bitPos -= numBits;
44*f6dc9357SAndroid Build Coastguard Worker         return;
45*f6dc9357SAndroid Build Coastguard Worker       }
46*f6dc9357SAndroid Build Coastguard Worker       numBits -= _bitPos;
47*f6dc9357SAndroid Build Coastguard Worker       _stream.WriteByte((Byte)(_curByte | (value << (8 - _bitPos))));
48*f6dc9357SAndroid Build Coastguard Worker       value >>= _bitPos;
49*f6dc9357SAndroid Build Coastguard Worker       _bitPos = 8;
50*f6dc9357SAndroid Build Coastguard Worker       _curByte = 0;
51*f6dc9357SAndroid Build Coastguard Worker     }
52*f6dc9357SAndroid Build Coastguard Worker   }
WriteByte(Byte b)53*f6dc9357SAndroid Build Coastguard Worker   void WriteByte(Byte b) { _stream.WriteByte(b);}
54*f6dc9357SAndroid Build Coastguard Worker };
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker #endif
57