aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/Common/InBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Common/InBuffer.h')
-rw-r--r--CPP/7zip/Common/InBuffer.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/CPP/7zip/Common/InBuffer.h b/CPP/7zip/Common/InBuffer.h
new file mode 100644
index 0000000..fa06394
--- /dev/null
+++ b/CPP/7zip/Common/InBuffer.h
@@ -0,0 +1,109 @@
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
10struct CInBufferException: public CSystemException
11{
12 CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
13};
14#endif
15
16class CInBufferBase
17{
18protected:
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
33public:
34 #ifdef _NO_EXCEPTIONS
35 HRESULT ErrorCode;
36 #endif
37 UInt32 NumExtraBytes;
38
39 CInBufferBase() throw();
40
41 // the size of portion of data in real stream that was already read from this object
42 // it doesn't include unused data in buffer
43 // it doesn't include virtual Extra bytes after the end of real stream data
44 UInt64 GetStreamSize() const { return _processedSize + (size_t)(_buf - _bufBase); }
45
46 // the size of virtual data that was read from this object
47 // it doesn't include unused data in buffers
48 // it includes any virtual Extra bytes after the end of real data
49 UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (size_t)(_buf - _bufBase); }
50
51 bool WasFinished() const { return _wasFinished; }
52
53 void SetStream(ISequentialInStream *stream) { _stream = stream; }
54
55 void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos)
56 {
57 _bufBase = buf;
58 _bufSize = bufSize;
59 _processedSize = 0;
60 _buf = buf + pos;
61 _bufLim = buf + end;
62 _wasFinished = false;
63 #ifdef _NO_EXCEPTIONS
64 ErrorCode = S_OK;
65 #endif
66 NumExtraBytes = 0;
67 }
68
69 void Init() throw();
70
71 MY_FORCE_INLINE
72 bool ReadByte(Byte &b)
73 {
74 if (_buf >= _bufLim)
75 return ReadByte_FromNewBlock(b);
76 b = *_buf++;
77 return true;
78 }
79
80 MY_FORCE_INLINE
81 bool ReadByte_FromBuf(Byte &b)
82 {
83 if (_buf >= _bufLim)
84 return false;
85 b = *_buf++;
86 return true;
87 }
88
89 MY_FORCE_INLINE
90 Byte ReadByte()
91 {
92 if (_buf >= _bufLim)
93 return ReadByte_FromNewBlock();
94 return *_buf++;
95 }
96
97 size_t ReadBytes(Byte *buf, size_t size);
98 size_t Skip(size_t size);
99};
100
101class CInBuffer: public CInBufferBase
102{
103public:
104 ~CInBuffer() { Free(); }
105 bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported!
106 void Free() throw();
107};
108
109#endif