You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.0 KiB
93 lines
2.0 KiB
4 months ago
|
// 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();
|
||
|
|
||
|
MY_FORCE_INLINE
|
||
|
bool ReadByte(Byte &b)
|
||
|
{
|
||
|
if (_buf >= _bufLim)
|
||
|
return ReadByte_FromNewBlock(b);
|
||
|
b = *_buf++;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
MY_FORCE_INLINE
|
||
|
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
|