michael@0: // Stream/LSBFEncoder.h michael@0: michael@0: #ifndef __STREAM_LSBFENCODER_H michael@0: #define __STREAM_LSBFENCODER_H michael@0: michael@0: #include "../IStream.h" michael@0: #include "OutBuffer.h" michael@0: michael@0: namespace NStream { michael@0: namespace NLSBF { michael@0: michael@0: class CEncoder michael@0: { michael@0: COutBuffer 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: FlushByte(); michael@0: return m_Stream.Flush(); michael@0: } michael@0: michael@0: void FlushByte() michael@0: { michael@0: if(m_BitPos < 8) michael@0: m_Stream.WriteByte(m_CurByte); michael@0: m_BitPos = 8; michael@0: m_CurByte = 0; michael@0: } michael@0: michael@0: void WriteBits(UInt32 value, int numBits); michael@0: UInt32 GetBitPosition() const { return (8 - m_BitPos); } michael@0: UInt64 GetProcessedSize() const { michael@0: return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) /8; } michael@0: void WriteByte(Byte b) { m_Stream.WriteByte(b);} michael@0: }; michael@0: michael@0: michael@0: }} michael@0: michael@0: #endif