// InBuffer.h | |
#ifndef __IN_BUFFER_H | |
#define __IN_BUFFER_H | |
#include "../../Common/MyException.h" | |
#include "../IStream.h" | |
#ifndef _NO_EXCEPTIONS | |
struct CInBufferException: public CSystemException | |
{ | |
CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} | |
}; | |
#endif | |
class CInBufferBase | |
{ | |
protected: | |
Byte *_buf; | |
Byte *_bufLim; | |
Byte *_bufBase; | |
ISequentialInStream *_stream; | |
UInt64 _processedSize; | |
size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger | |
// only up to 32-bits values now are supported! | |
bool _wasFinished; | |
bool ReadBlock(); | |
bool ReadByte_FromNewBlock(Byte &b); | |
Byte ReadByte_FromNewBlock(); | |
public: | |
#ifdef _NO_EXCEPTIONS | |
HRESULT ErrorCode; | |
#endif | |
UInt32 NumExtraBytes; | |
CInBufferBase() throw(); | |
UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); } | |
UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); } | |
bool WasFinished() const { return _wasFinished; } | |
void SetStream(ISequentialInStream *stream) { _stream = stream; } | |
void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos) | |
{ | |
_bufBase = buf; | |
_bufSize = bufSize; | |
_processedSize = 0; | |
_buf = buf + pos; | |
_bufLim = buf + end; | |
_wasFinished = false; | |
#ifdef _NO_EXCEPTIONS | |
ErrorCode = S_OK; | |
#endif | |
NumExtraBytes = 0; | |
} | |
void Init() throw(); | |
bool ReadByte(Byte &b) | |
{ | |
if (_buf >= _bufLim) | |
return ReadByte_FromNewBlock(b); | |
b = *_buf++; | |
return true; | |
} | |
Byte ReadByte() | |
{ | |
if (_buf >= _bufLim) | |
return ReadByte_FromNewBlock(); | |
return *_buf++; | |
} | |
size_t ReadBytes(Byte *buf, size_t size); | |
size_t Skip(size_t size); | |
}; | |
class CInBuffer: public CInBufferBase | |
{ | |
public: | |
~CInBuffer() { Free(); } | |
bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported! | |
void Free() throw(); | |
}; | |
#endif |