Jpp  15.0.1-rc.1-highQE
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
8 #include "JIO/JSerialisable.hh"
9 
10 
11 /**
12  * \author mdejong
13  */
14 
15 namespace JIO {}
16 namespace JPP { using namespace JIO; }
17 
18 namespace JIO {
19 
20 
21  /**
22  * Buffered binary input.
23  * This class implements the JReader interface.
24  */
25  class JBufferedReader :
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 
140 
141  /**
142  * Buffered binary output.
143  * This class implements the JWriter interface.
144  */
146  public JWriter
147  {
148  public:
149  /**
150  * Constructor.
151  * Note that this object owns the writer pointed to.
152  *
153  * \param __out pointer to writer
154  * \param __size size of internal buffer
155  */
156  JBufferedWriter(JWriter* __out, const int __size = 1048576) :
157  out(__out)
158  {
159  size = std::max(__size, 1024);
160  buffer = new char[size];
161 
162  pos = 0;
163  }
164 
165 
166  /**
167  * Destructor.
168  */
170  {
171  flush();
172 
173  delete [] buffer;
174  }
175 
176 
177  /**
178  * Status of writer.
179  *
180  * \return status of this writer
181  */
182  virtual bool getStatus() const override
183  {
184  return (bool) *out;
185  }
186 
187 
188  /**
189  * Write byte array.
190  *
191  * \param zbuf pointer to byte array
192  * \param n number of bytes
193  * \return number of bytes
194  */
195  virtual int write(const char* zbuf, int n) override
196  {
197  for (int i = 0; i != n; ) {
198 
199  int m = n - i;
200 
201  if (m > size - pos) {
202 
203  flush();
204 
205  if (m > size - pos) {
206  m = size - pos;
207  }
208  }
209 
210  memcpy(buffer + pos, zbuf + i, m);
211 
212  i += m;
213  pos += m;
214  }
215 
216  return n;
217  }
218 
219 
220  /**
221  * Write internal data to output.
222  */
223  void flush()
224  {
225  pos -= out->write(buffer, pos);
226  }
227 
228 
229  protected:
231 
232  char* buffer; //!< internal buffer
233  int size; //!< size of internal buffer
234  int pos; //!< pointer to end of buffered data
235  };
236 }
237 
238 #endif
virtual bool getStatus() const override
Status of reader.
Definition: JBufferedIO.hh:60
Interface for binary output.
virtual void clear() override
Clear status of reader.
Definition: JBufferedIO.hh:69
virtual bool getStatus() const override
Status of writer.
Definition: JBufferedIO.hh:182
JBufferedReader(JReader *__in, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:36
int pos
pointer to end of buffered data
Definition: JBufferedIO.hh:234
int pos
pointer to begin of available data
Definition: JBufferedIO.hh:135
int ls
pointer to end of available data
Definition: JBufferedIO.hh:136
~JBufferedWriter()
Destructor.
Definition: JBufferedIO.hh:169
JLANG::JSinglePointer< JWriter > out
Definition: JBufferedIO.hh:230
The template JSinglePointer class can be used to hold a pointer to an object.
const int n
Definition: JPolint.hh:660
virtual int read(char *zbuf, int n) override
Read byte array.
Definition: JBufferedIO.hh:82
bool eof
end of file
Definition: JBufferedIO.hh:137
Interface for binary input.
Buffered binary output.
Definition: JBufferedIO.hh:145
virtual int write(const char *zbuf, int n) override
Write byte array.
Definition: JBufferedIO.hh:195
JBufferedWriter(JWriter *__out, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:156
JLANG::JSinglePointer< JReader > in
Definition: JBufferedIO.hh:131
int size
size of internal buffer
Definition: JBufferedIO.hh:233
~JBufferedReader()
Destructor.
Definition: JBufferedIO.hh:49
int size
size of internal buffer
Definition: JBufferedIO.hh:134
Buffered binary input.
Definition: JBufferedIO.hh:25
char * buffer
internal buffer
Definition: JBufferedIO.hh:232
void reset()
Reset.
Definition: JBufferedIO.hh:124
char * buffer
internal buffer
Definition: JBufferedIO.hh:133
void flush()
Write internal data to output.
Definition: JBufferedIO.hh:223