1 // InBuffer.h
2 
3 #ifndef __IN_BUFFER_H
4 #define __IN_BUFFER_H
5 
6 #include "../../Common/MyException.h"
7 #include "../IStream.h"
8 
9 #ifndef _NO_EXCEPTIONS
10 struct CInBufferException: public CSystemException
11 {
CInBufferExceptionCInBufferException12   CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
13 };
14 #endif
15 
16 class CInBufferBase
17 {
18 protected:
19   Byte *_buf;
20   Byte *_bufLim;
21   Byte *_bufBase;
22 
23   ISequentialInStream *_stream;
24   UInt64 _processedSize;
25   size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger
26                    // only up to 32-bits values now are supported!
27   bool _wasFinished;
28 
29   bool ReadBlock();
30   bool ReadByte_FromNewBlock(Byte &b);
31   Byte ReadByte_FromNewBlock();
32 
33 public:
34   #ifdef _NO_EXCEPTIONS
35   HRESULT ErrorCode;
36   #endif
37   UInt32 NumExtraBytes;
38 
39   CInBufferBase() throw();
40 
GetStreamSize()41   UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); }
GetProcessedSize()42   UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); }
WasFinished()43   bool WasFinished() const { return _wasFinished; }
44 
SetStream(ISequentialInStream * stream)45   void SetStream(ISequentialInStream *stream) { _stream = stream; }
46 
SetBuf(Byte * buf,size_t bufSize,size_t end,size_t pos)47   void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos)
48   {
49     _bufBase = buf;
50     _bufSize = bufSize;
51     _processedSize = 0;
52     _buf = buf + pos;
53     _bufLim = buf + end;
54     _wasFinished = false;
55     #ifdef _NO_EXCEPTIONS
56     ErrorCode = S_OK;
57     #endif
58     NumExtraBytes = 0;
59   }
60 
61   void Init() throw();
62 
63   MY_FORCE_INLINE
ReadByte(Byte & b)64   bool ReadByte(Byte &b)
65   {
66     if (_buf >= _bufLim)
67       return ReadByte_FromNewBlock(b);
68     b = *_buf++;
69     return true;
70   }
71 
72   MY_FORCE_INLINE
ReadByte()73   Byte ReadByte()
74   {
75     if (_buf >= _bufLim)
76       return ReadByte_FromNewBlock();
77     return *_buf++;
78   }
79 
80   size_t ReadBytes(Byte *buf, size_t size);
81   size_t Skip(size_t size);
82 };
83 
84 class CInBuffer: public CInBufferBase
85 {
86 public:
~CInBuffer()87   ~CInBuffer() { Free(); }
88   bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported!
89   void Free() throw();
90 };
91 
92 #endif
93