1// LZOutWindow.h 2 3#ifndef __LZ_OUT_WINDOW_H 4#define __LZ_OUT_WINDOW_H 5 6#include "../../IStream.h" 7#include "../../Common/OutBuffer.h" 8 9#ifndef _NO_EXCEPTIONS 10typedef COutBufferException CLZOutWindowException; 11#endif 12 13class CLZOutWindow: public COutBuffer 14{ 15public: 16 void Init(bool solid = false); 17 18 // distance >= 0, len > 0, 19 bool CopyBlock(UInt32 distance, UInt32 len) 20 { 21 UInt32 pos = _pos - distance - 1; 22 if (distance >= _pos) 23 { 24 if (!_overDict || distance >= _bufferSize) 25 return false; 26 pos += _bufferSize; 27 } 28 if (_limitPos - _pos > len && _bufferSize - pos > len) 29 { 30 const Byte *src = _buffer + pos; 31 Byte *dest = _buffer + _pos; 32 _pos += len; 33 do 34 *dest++ = *src++; 35 while(--len != 0); 36 } 37 else do 38 { 39 if (pos == _bufferSize) 40 pos = 0; 41 _buffer[_pos++] = _buffer[pos++]; 42 if (_pos == _limitPos) 43 FlushWithCheck(); 44 } 45 while(--len != 0); 46 return true; 47 } 48 49 void PutByte(Byte b) 50 { 51 _buffer[_pos++] = b; 52 if (_pos == _limitPos) 53 FlushWithCheck(); 54 } 55 56 Byte GetByte(UInt32 distance) const 57 { 58 UInt32 pos = _pos - distance - 1; 59 if (pos >= _bufferSize) 60 pos += _bufferSize; 61 return _buffer[pos]; 62 } 63}; 64 65#endif 66