Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JBufferedIO.hh
Go to the documentation of this file.
1#ifndef __JIO__JBUFFEREDIO__
2#define __JIO__JBUFFEREDIO__
3
4#include <algorithm>
5#include <cstring>
6
9
10
11/**
12 * \author mdejong
13 */
14
15namespace JIO {}
16namespace JPP { using namespace JIO; }
17
18namespace JIO {
19
20
21 /**
22 * Buffered binary input.
23 * This class implements the JReader interface.
24 */
26 public JReader
27 {
28 public:
29 /**
30 * Constructor.
31 * Note that this object owns the reader pointed to.
32 *
33 * \param __in pointer to reader
34 * \param __size size of internal buffer
35 */
36 JBufferedReader(JReader* __in, const int __size = 1048576) :
37 in(__in)
38 {
39 size = std::max(__size, 1024);
40 buffer = new char[size];
41
42 reset();
43 }
44
45
46 /**
47 * Destructor.
48 */
50 {
51 delete [] buffer;
52 }
53
54
55 /**
56 * Status of reader.
57 *
58 * \return status of this reader
59 */
60 virtual bool getStatus() const override
61 {
62 return in->getStatus() || !eof;
63 }
64
65
66 /**
67 * Clear status of reader.
68 */
69 virtual void clear() override
70 {
71 in->clear();
72 }
73
74
75 /**
76 * Read byte array.
77 *
78 * \param zbuf pointer to byte array
79 * \param n number of bytes
80 * \return number of bytes
81 */
82 virtual int read(char* zbuf, int n) override
83 {
84 for (int i = 0; i != n; ) {
85
86 int m = n - i;
87
88 if (m > ls - pos) {
89
90 memmove(buffer, buffer + pos, ls - pos);
91
92 ls -= pos;
93 pos = 0;
94 ls += in->read(buffer + ls, size - ls);
95
96 if (m > ls) {
97
98 if (ls == 0) {
99
100 eof = true;
101
102 return n - i;
103 }
104
105 m = ls;
106 }
107 }
108
109 memcpy(zbuf + i, buffer + pos, m);
110
111 i += m;
112 pos += m;
113 }
114
115 eof = false;
116
117 return n;
118 }
119
120 protected:
121 /**
122 * Reset.
123 */
124 void reset()
125 {
126 pos = 0;
127 ls = 0;
128 eof = true;
129 }
130
132
133 char* buffer; //!< internal buffer
134 int size; //!< size of internal buffer
135 int pos; //!< pointer to begin of available data
136 int ls; //!< pointer to end of available data
137 bool eof; //!< end of file
138
139 private:
144 };
145
146
147 /**
148 * Buffered binary output.
149 * This class implements the JWriter interface.
150 */
152 public JWriter
153 {
154 public:
155 /**
156 * Constructor.
157 * Note that this object owns the writer pointed to.
158 *
159 * \param __out pointer to writer
160 * \param __size size of internal buffer
161 */
162 JBufferedWriter(JWriter* __out, const int __size = 1048576) :
163 out(__out)
164 {
165 size = std::max(__size, 1024);
166 buffer = new char[size];
167
168 pos = 0;
169 }
170
171
172 /**
173 * Destructor.
174 */
176 {
177 flush();
178
179 delete [] buffer;
180 }
181
182
183 /**
184 * Status of writer.
185 *
186 * \return status of this writer
187 */
188 virtual bool getStatus() const override
189 {
190 return (bool) *out;
191 }
192
193
194 /**
195 * Write byte array.
196 *
197 * \param zbuf pointer to byte array
198 * \param n number of bytes
199 * \return number of bytes
200 */
201 virtual int write(const char* zbuf, int n) override
202 {
203 for (int i = 0; i != n; ) {
204
205 int m = n - i;
206
207 if (m > size - pos) {
208
209 flush();
210
211 if (m > size - pos) {
212 m = size - pos;
213 }
214 }
215
216 memcpy(buffer + pos, zbuf + i, m);
217
218 i += m;
219 pos += m;
220 }
221
222 return n;
223 }
224
225
226 /**
227 * Write internal data to output.
228 */
229 void flush()
230 {
231 pos -= out->write(buffer, pos);
232 }
233
234
235 protected:
237
238 char* buffer; //!< internal buffer
239 int size; //!< size of internal buffer
240 int pos; //!< pointer to end of buffered data
241
242 private:
247 };
248}
249
250#endif
Buffered binary input.
char * buffer
internal buffer
~JBufferedReader()
Destructor.
int ls
pointer to end of available data
JBufferedReader(JBufferedReader &&)
bool eof
end of file
JBufferedReader(const JBufferedReader &)
JBufferedReader & operator=(const JBufferedReader &)
JLANG::JSinglePointer< JReader > in
JBufferedReader(JReader *__in, const int __size=1048576)
Constructor.
virtual void clear() override
Clear status of reader.
JBufferedReader & operator=(JBufferedReader &&)
int pos
pointer to begin of available data
virtual int read(char *zbuf, int n) override
Read byte array.
virtual bool getStatus() const override
Status of reader.
int size
size of internal buffer
Buffered binary output.
char * buffer
internal buffer
JBufferedWriter & operator=(JBufferedWriter &&)
int size
size of internal buffer
JBufferedWriter(JBufferedWriter &&)
virtual int write(const char *zbuf, int n) override
Write byte array.
JLANG::JSinglePointer< JWriter > out
JBufferedWriter(const JBufferedWriter &)
virtual bool getStatus() const override
Status of writer.
void flush()
Write internal data to output.
~JBufferedWriter()
Destructor.
JBufferedWriter & operator=(const JBufferedWriter &)
int pos
pointer to end of buffered data
JBufferedWriter(JWriter *__out, const int __size=1048576)
Constructor.
Interface for binary input.
Interface for binary output.
The template JSinglePointer class can be used to hold a pointer to an object.
Auxiliary classes and methods for binary I/O.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).