Jpp
 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  pos = 0;
43  ls = 0;
44  eof = true;
45  }
46 
47 
48  /**
49  * Destructor.
50  */
52  {
53  delete [] buffer;
54  }
55 
56 
57  /**
58  * Status of reader.
59  *
60  * \return status of this reader
61  */
62  virtual bool getStatus() const
63  {
64  return in->getStatus() || !eof;
65  }
66 
67 
68  /**
69  * Clear status of reader.
70  */
71  virtual void clear()
72  {
73  in->clear();
74  }
75 
76 
77  /**
78  * Read byte array.
79  *
80  * \param zbuf pointer to byte array
81  * \param n number of bytes
82  * \return number of bytes
83  */
84  virtual int read(char* zbuf, int n)
85  {
86  for (int i = 0; i != n; ) {
87 
88  int m = n - i;
89 
90  if (m > ls - pos) {
91 
92  memmove(buffer, buffer + pos, ls - pos);
93 
94  ls -= pos;
95  pos = 0;
96  ls += in->read(buffer + ls, size - ls);
97 
98  if (m > ls) {
99 
100  if (ls == 0) {
101 
102  eof = true;
103 
104  return n - i;
105  }
106 
107  m = ls;
108  }
109  }
110 
111  memcpy(zbuf + i, buffer + pos, m);
112 
113  i += m;
114  pos += m;
115  }
116 
117  eof = false;
118 
119  return n;
120  }
121 
122 
123  protected:
125 
126  char* buffer; //!< internal buffer
127  int size; //!< size of internal buffer
128  int pos; //!< pointer to begin of available data
129  int ls; //!< pointer to end of available data
130  bool eof; //!< end of file
131  };
132 
133 
134  /**
135  * Buffered binary output.
136  * This class implements the JWriter interface.
137  */
139  public JWriter
140  {
141  public:
142  /**
143  * Constructor.
144  * Note that this object owns the writer pointed to.
145  *
146  * \param __out pointer to writer
147  * \param __size size of internal buffer
148  */
149  JBufferedWriter(JWriter* __out, const int __size = 1048576) :
150  out(__out)
151  {
152  size = std::max(__size, 1024);
153  buffer = new char[size];
154 
155  pos = 0;
156  }
157 
158 
159  /**
160  * Destructor.
161  */
163  {
164  flush();
165 
166  delete [] buffer;
167  }
168 
169 
170  /**
171  * Status of writer.
172  *
173  * \return status of this writer
174  */
175  virtual bool getStatus() const
176  {
177  return (bool) *out;
178  }
179 
180 
181  /**
182  * Write byte array.
183  *
184  * \param zbuf pointer to byte array
185  * \param n number of bytes
186  * \return number of bytes
187  */
188  virtual int write(const char* zbuf, int n)
189  {
190  for (int i = 0; i != n; ) {
191 
192  int m = n - i;
193 
194  if (m > size - pos) {
195 
196  flush();
197 
198  if (m > size - pos) {
199  m = size - pos;
200  }
201  }
202 
203  memcpy(buffer + pos, zbuf + i, m);
204 
205  i += m;
206  pos += m;
207  }
208 
209  return n;
210  }
211 
212 
213  /**
214  * Write internal data to output.
215  */
216  void flush()
217  {
218  pos -= out->write(buffer, pos);
219  }
220 
221 
222  protected:
224 
225  char* buffer; //!< internal buffer
226  int size; //!< size of internal buffer
227  int pos; //!< pointer to end of buffered data
228  };
229 }
230 
231 #endif
Interface for binary output.
JBufferedReader(JReader *__in, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:36
int pos
pointer to end of buffered data
Definition: JBufferedIO.hh:227
int pos
pointer to begin of available data
Definition: JBufferedIO.hh:128
int ls
pointer to end of available data
Definition: JBufferedIO.hh:129
~JBufferedWriter()
Destructor.
Definition: JBufferedIO.hh:162
virtual int read(char *zbuf, int n)
Read byte array.
Definition: JBufferedIO.hh:84
virtual bool getStatus() const
Status of reader.
Definition: JBufferedIO.hh:62
virtual bool getStatus() const
Status of writer.
Definition: JBufferedIO.hh:175
JLANG::JSinglePointer< JWriter > out
Definition: JBufferedIO.hh:223
The template JSinglePointer class can be used to hold a pointer to an object.
virtual int write(const char *zbuf, int n)
Write byte array.
Definition: JBufferedIO.hh:188
bool eof
end of file
Definition: JBufferedIO.hh:130
Interface for binary input.
Buffered binary output.
Definition: JBufferedIO.hh:138
JBufferedWriter(JWriter *__out, const int __size=1048576)
Constructor.
Definition: JBufferedIO.hh:149
JLANG::JSinglePointer< JReader > in
Definition: JBufferedIO.hh:124
int size
size of internal buffer
Definition: JBufferedIO.hh:226
~JBufferedReader()
Destructor.
Definition: JBufferedIO.hh:51
int size
size of internal buffer
Definition: JBufferedIO.hh:127
Buffered binary input.
Definition: JBufferedIO.hh:25
alias put_queue eval echo n
Definition: qlib.csh:19
virtual void clear()
Clear status of reader.
Definition: JBufferedIO.hh:71
char * buffer
internal buffer
Definition: JBufferedIO.hh:225
char * buffer
internal buffer
Definition: JBufferedIO.hh:126
void flush()
Write internal data to output.
Definition: JBufferedIO.hh:216