michael@0: // Stream/MSBFEncoder.h michael@0: michael@0: #ifndef __STREAM_MSBFENCODER_H michael@0: #define __STREAM_MSBFENCODER_H michael@0: michael@0: #include "Common/Defs.h" michael@0: #include "../IStream.h" michael@0: #include "OutBuffer.h" michael@0: michael@0: namespace NStream { michael@0: namespace NMSBF { michael@0: michael@0: template michael@0: class CEncoder michael@0: { michael@0: TOutByte m_Stream; michael@0: int m_BitPos; michael@0: Byte m_CurByte; michael@0: public: michael@0: bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); } michael@0: void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream);} michael@0: void ReleaseStream() { m_Stream.ReleaseStream(); } michael@0: void Init() michael@0: { michael@0: m_Stream.Init(); michael@0: m_BitPos = 8; michael@0: m_CurByte = 0; michael@0: } michael@0: HRESULT Flush() michael@0: { michael@0: if(m_BitPos < 8) michael@0: WriteBits(0, m_BitPos); michael@0: return m_Stream.Flush(); michael@0: } michael@0: michael@0: void WriteBits(UInt32 value, int numBits) michael@0: { michael@0: while(numBits > 0) michael@0: { michael@0: if (numBits < m_BitPos) michael@0: { michael@0: m_CurByte |= ((Byte)value << (m_BitPos -= numBits)); michael@0: return; michael@0: } michael@0: numBits -= m_BitPos; michael@0: UInt32 newBits = (value >> numBits); michael@0: value -= (newBits << numBits); michael@0: m_Stream.WriteByte(m_CurByte | (Byte)newBits); michael@0: m_BitPos = 8; michael@0: m_CurByte = 0; michael@0: } michael@0: } michael@0: UInt64 GetProcessedSize() const { michael@0: return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) / 8; } michael@0: }; michael@0: michael@0: }} michael@0: michael@0: #endif