Jpp  17.3.0-rc.1
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  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
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:188
JBufferedReader(JReader *__in, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:36
int pos
pointer to end of buffered data
Definition: JBufferedIO.hh:240
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:175
JBufferedReader & operator=(const JBufferedReader &)
JBufferedWriter & operator=(const JBufferedWriter &)
JLANG::JSinglePointer< JWriter > out
Definition: JBufferedIO.hh:236
The template JSinglePointer class can be used to hold a pointer to an object.
const int n
Definition: JPolint.hh:697
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:151
virtual int write(const char *zbuf, int n) override
Write byte array.
Definition: JBufferedIO.hh:201
JBufferedWriter(JWriter *__out, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:162
JLANG::JSinglePointer< JReader > in
Definition: JBufferedIO.hh:131
int size
size of internal buffer
Definition: JBufferedIO.hh:239
~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:238
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:229