GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Buffer.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2004 by Olivier Stezowski *
3  * stezow(AT)ipnl.in2p3.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
20 
23 #ifndef GWS_BUFFER_H
24 #define GWS_BUFFER_H
25 
26 #ifndef GWS_MEMORY_H
27 #include "Memory.h"
28 #endif
29 
30 #include <iostream>
31 using namespace std;
32 
33 namespace Gws {
34 
36 
43 class Buffer : protected Memory
44 {
45 public:
46  enum EStatus { kBad = BIT(1), kGood = BIT(2), kEoB = BIT(3), kFail = BIT(4), kCorrupt = BIT(5) } ;
48 
60 private:
61  static const Char_t fC1 = 'E', fC2 = 'B';
62 
63 protected:
64  Int_t fStatus;
65  Int_t fEndian;
66 
67  Char_t * fBuffer;
68  UInt_t fSize;
69  UInt_t fCurrent;
70 
71  void DoAlloc(UInt_t);
72 
73 public:
75 
77  explicit Buffer(UInt_t s = 32 * KBYTE);
78  virtual ~Buffer();
79 
81 
85  // static void Copy(const Buffer &, Buffer &, Int_t);
87 
90  static Buffer * New(Memory::EEndian e, UInt_t s = 32 * KBYTE);
91 
92  bool IsStatus(Buffer::EStatus);
93  void SetStatus(Buffer::EStatus);
94 
95  bool IsBytes(Memory::EEndian) const;
96  void SetBytes(Memory::EEndian);
97 
99 
102  Char_t *GetBuffer();
104  UInt_t Size() const;
106  UInt_t FreeSize() const;
108  UInt_t Offset() const;
109 
111 
114  UInt_t SetOffset(UInt_t off = 0);
115 
117 
120  virtual void Reset();
121  virtual void Reset(UInt_t);
122 
123 
125 
130  virtual Bool_t Expand(UInt_t);
131 
132 
133  virtual Buffer &operator << (Char_t);
134  virtual Buffer &operator << (UChar_t);
135  virtual Buffer &operator << (Short_t);
136  virtual Buffer &operator << (UShort_t);
137  virtual Buffer &operator << (Int_t);
138  virtual Buffer &operator << (UInt_t);
139  virtual Buffer &operator << (Float_t);
140  virtual Buffer &operator << (Double_t);
141 // virtual Buffer &operator << (long);
142 // virtual Buffer &operator << (unsigned long);
143 
144  virtual Buffer &operator>> (Char_t &);
145  virtual Buffer &operator>> (UChar_t &);
146  virtual Buffer &operator>> (Short_t &);
147  virtual Buffer &operator>> (UShort_t &);
148  virtual Buffer &operator>> (Int_t &);
149  virtual Buffer &operator>> (UInt_t &);
150  virtual Buffer &operator>> (Float_t &);
151  virtual Buffer &operator>> (Double_t &);
152 // virtual Buffer &operator>> (long &);
153 // virtual Buffer &operator>> (unsigned long &);
154 };
155 // inline Buffer members
156 inline bool Buffer::IsStatus(Buffer::EStatus s) {
157  if ( s == Buffer::kCorrupt )
158  if ( fBuffer[fSize] != fC1 && fBuffer[fSize+1] != fC2 ) fStatus |= Buffer::kCorrupt;
159  return fStatus & s;
160 }
161 inline void Buffer::SetStatus(Buffer::EStatus s) { fStatus = s; }
162 inline bool Buffer::IsBytes(Memory::EEndian e) const { return fEndian == e; }
163 inline void Buffer::SetBytes(Memory::EEndian e) { fEndian = e; }
164 inline Char_t * Buffer::GetBuffer() { return fBuffer ; }
165 inline UInt_t Buffer::Size() const { return fSize; }
166 inline UInt_t Buffer::Offset() const { return fCurrent ; }
167 inline UInt_t Buffer::FreeSize() const { return fSize - fCurrent; }
168 inline Buffer &Buffer::operator << (Char_t data) {
169  if (FreeSize()>=sizeof(Char_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(Char_t)); fCurrent += sizeof(Char_t); }
170  else fStatus = Buffer::kFail ;
171  return (*this);
172 }
173 inline Buffer &Buffer::operator << (UChar_t data){
174  if (FreeSize()>=sizeof(Char_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(UChar_t)); fCurrent += sizeof(Char_t); }
175  else fStatus = Buffer::kFail ;
176  return (*this);
177 }
178 inline Buffer &Buffer::operator << (Short_t data) {
179  if (FreeSize()>=sizeof(Short_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(Short_t)); fCurrent += sizeof(Short_t); }
180  else fStatus = Buffer::kFail ;
181  return (*this);
182 }
183 inline Buffer &Buffer::operator << (UShort_t data){
184  if (FreeSize()>=sizeof(Short_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(UShort_t)); fCurrent += sizeof(UShort_t); }
185  else fStatus = Buffer::kFail ;
186  return (*this);
187 }
188 inline Buffer &Buffer::operator << (Int_t data) {
189  if (FreeSize()>=sizeof(Int_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(Int_t)); fCurrent += sizeof(Int_t); }
190  else fStatus = Buffer::kFail ;
191  return (*this);
192 }
193 inline Buffer &Buffer::operator << (UInt_t data){
194  if (FreeSize()>=sizeof(Int_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(UInt_t)); fCurrent += sizeof(UInt_t); }
195  else fStatus = Buffer::kFail ;
196  return (*this);
197 }
198 inline Buffer &Buffer::operator << (Float_t data) {
199  if (FreeSize()>=sizeof(Float_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(Float_t)); fCurrent += sizeof(Float_t); }
200  else fStatus = Buffer::kFail ;
201  return (*this);
202 }
203 inline Buffer &Buffer::operator << (Double_t data) {
204  if (FreeSize()>=sizeof(Double_t)) { ::memcpy((fBuffer+fCurrent),&data,sizeof(Double_t));fCurrent += sizeof(Double_t); }
205  else fStatus = Buffer::kFail ;
206  return (*this);
207 }
208 /*
209 inline Buffer &Buffer::operator << (long data){
210  if (FreeSize()>=sizeof(long)) { Memory::Copy((Char_t*)&data,(fBuffer+fCurrent),sizeof(long));fCurrent += sizeof(long); }
211  else fStatus = Buffer::kFail ;
212  return (*this);
213 }
214 inline Buffer &Buffer::operator << (unsigned long data) {
215  if (FreeSize()>=sizeof(long)) { Memory::Copy((Char_t*)&data,(fBuffer+fCurrent),sizeof(long));fCurrent += sizeof(long); }
216  else fStatus = Buffer::kFail ;// inline Buffer members
217  return (*this);
218 }*/
219 
220 inline Buffer &Buffer::operator >> (Char_t &data){
221  if (FreeSize()>=sizeof(Char_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(Char_t));fCurrent += sizeof(Char_t); }
222  else fStatus = Buffer::kFail ;
223  return (*this);
224 }
225 inline Buffer &Buffer::operator >> (UChar_t &data){
226  if (FreeSize()>=sizeof(Char_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(UChar_t));fCurrent += sizeof(UChar_t); }
227  else fStatus = Buffer::kFail ;
228  return (*this);
229 }
230 inline Buffer &Buffer::operator >> (Short_t &data){
231  if (FreeSize()>=sizeof(Short_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(Short_t));fCurrent += sizeof(Short_t); }
232  else fStatus = Buffer::kFail ;
233  return (*this);
234 }
235 inline Buffer &Buffer::operator >> (UShort_t &data){
236  if (FreeSize()>=sizeof(Short_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(UShort_t));fCurrent += sizeof(UShort_t); }
237  else fStatus = Buffer::kFail ;
238  return (*this);
239 }
240 inline Buffer & Buffer::operator >> (Int_t &data){
241  if (FreeSize()>=sizeof(Int_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(Int_t));fCurrent += sizeof(Int_t); }
242  else fStatus = Buffer::kFail ;
243  return (*this) ;
244 }
245 inline Buffer &Buffer::operator >> (UInt_t &data){
246  if (FreeSize()>=sizeof(Int_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(UInt_t));fCurrent += sizeof(UInt_t); }
247  else fStatus = Buffer::kFail ;
248  return (*this);
249 }
250 inline Buffer &Buffer::operator >> (Float_t &data){
251  if (FreeSize()>=sizeof(Float_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(Float_t));fCurrent += sizeof(Float_t); }
252  else fStatus = Buffer::kFail ;
253  return (*this);
254 }
255 inline Buffer &Buffer::operator >> (Double_t &data){
256  if (FreeSize()>=sizeof(Double_t)) { ::memcpy(&data,fBuffer+fCurrent,sizeof(Double_t));fCurrent += sizeof(Double_t); }
257  else fStatus = Buffer::kFail ;
258  return (*this);
259 }
260 
261 // inline Buffer members //////////////////////////
262 
264 
269 class EndianBuffer : public Buffer
270 {
271 public:
272  EndianBuffer(UInt_t s = 32 * KBYTE);
273  virtual ~EndianBuffer();
274 
275  virtual Buffer &operator << (Char_t) ;
276  virtual Buffer &operator << (UChar_t);
277  virtual Buffer &operator << (Short_t);
278  virtual Buffer &operator << (UShort_t);
279  virtual Buffer &operator << (Int_t);
280  virtual Buffer &operator << (UInt_t);
281  virtual Buffer &operator << (Float_t);
282  virtual Buffer &operator << (Double_t);
283 // virtual Buffer &operator << (long);
284 // virtual Buffer &operator << (unsigned long);
285 
286  virtual Buffer &operator >> (Char_t &);
287  virtual Buffer &operator >> (UChar_t &);
288  virtual Buffer &operator >> (Short_t &);
289  virtual Buffer &operator >> (UShort_t &);
290  virtual Buffer &operator >> (Int_t &);
291  virtual Buffer &operator >> (UInt_t &);
292  virtual Buffer &operator >> (Float_t &);
293  virtual Buffer &operator >> (Double_t &);
294 // virtual Buffer &operator >> (long &);
295 // virtual Buffer &operator >> (unsigned long &);
296 };
297 // inline EndianBuffer members
298 inline Buffer &EndianBuffer::operator << (Char_t data) { return Buffer::operator << (data) ;}
299 inline Buffer &EndianBuffer::operator << (UChar_t data) { return Buffer::operator << (data); }
300 inline Buffer &EndianBuffer::operator << (Short_t data) {
301  if (FreeSize()>=sizeof(Short_t)) { Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(Short_t); }
302  else fStatus = Buffer::kFail ;
303  return (*this);
304 }
305 inline Buffer &EndianBuffer::operator << (UShort_t data){
306  if (FreeSize()>=sizeof(Short_t)) { Memory::Swap(data,fBuffer+fCurrent); fCurrent += sizeof(Short_t); }
307  else fStatus = Buffer::kFail ;
308  return (*this);
309 }
310 inline Buffer &EndianBuffer::operator << (Int_t data) {
311  if (FreeSize()>=sizeof(Int_t)) { Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(Int_t); }
312  else fStatus = Buffer::kFail ;
313  return (*this);
314 }
315 inline Buffer &EndianBuffer::operator << (UInt_t data){
316  if (FreeSize()>=sizeof(Int_t)) { Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(Int_t); }
317  else fStatus = Buffer::kFail ;
318  return (*this);
319 }
320 
321 inline Buffer &EndianBuffer::operator << (Float_t data) {
322  if (FreeSize()>=sizeof(Float_t)) { Memory::Swap(data,fBuffer+fCurrent); fCurrent += sizeof(Float_t); }
323  else fStatus = Buffer::kFail ;
324  return (*this);
325 }
326 inline Buffer &EndianBuffer::operator << (Double_t data) {
327  if (FreeSize()>=sizeof(Double_t)){ Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(Double_t); }
328  else fStatus = Buffer::kFail ;
329  return (*this);
330 }
331 /*
332 inline Buffer &EndianBuffer::operator << (long data){
333  if (FreeSize()>=sizeof(long)) { Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(long); }
334  else fStatus = Buffer::kFail ;
335  return (*this);
336 }
337 inline Buffer &EndianBuffer::operator << (unsigned long data) {
338  if (FreeSize()>=sizeof(long)){ Memory::Swap(data,fBuffer+fCurrent);fCurrent += sizeof(long); }
339  else fStatus = Buffer::kFail ;
340  return (*this);
341 }
342 */
343 inline Buffer &EndianBuffer::operator >> (Char_t &data) { return Buffer::operator >> (data) ;}
344 inline Buffer &EndianBuffer::operator >> (UChar_t &data) { return Buffer::operator >> (data); }
345 inline Buffer &EndianBuffer::operator >> (Short_t &data){
346  if (FreeSize()>=sizeof(Short_t)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(Short_t); }
347  else fStatus = Buffer::kFail ;
348  return (*this);
349 }
350 inline Buffer &EndianBuffer::operator >> (UShort_t &data){
351  if (FreeSize()>=sizeof(Short_t)){ Memory::Swap(fBuffer+fCurrent,data);fCurrent += sizeof(Short_t); }
352  else fStatus = Buffer::kFail ;
353  return (*this);
354 }
355 inline Buffer &EndianBuffer::operator >> (Int_t &data){
356  if (FreeSize()>=sizeof(Int_t)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(Int_t); }
357  else fStatus = Buffer::kFail ;
358  return (*this);
359 }
360 inline Buffer &EndianBuffer::operator >> (UInt_t &data){
361  if (FreeSize()>=sizeof(Int_t)){ Memory::Swap(fBuffer+fCurrent,data);fCurrent += sizeof(Int_t); }
362  else fStatus = Buffer::kFail ;
363  return (*this);
364 }
365 /*
366 inline Buffer &EndianBuffer::operator >> (long &data){
367  if (FreeSize()>=sizeof(long)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(long); }
368  else fStatus = Buffer::kFail ;
369  return (*this);
370 }
371 inline Buffer &EndianBuffer::operator >> (unsigned long &data){
372  if (FreeSize()>=sizeof(long)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(long); }
373  else fStatus = Buffer::kFail ;
374  return (*this);
375 }
376 */
377 inline Buffer &EndianBuffer::operator >> (Float_t &data){
378  if (FreeSize()>=sizeof(Float_t)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(Float_t); }
379  else fStatus = Buffer::kFail ;
380  return (*this);
381 }
382 inline Buffer &EndianBuffer::operator >> (Double_t &data){
383  if (FreeSize()>=sizeof(Double_t)){ Memory::Swap(fBuffer+fCurrent,data); fCurrent += sizeof(Double_t); }
384  else fStatus = Buffer::kFail ;
385  return (*this);
386 }
387 }; // gws
388 
389 #endif
EEndian
The adjectives big-endian and little-endian refer to which bytes are most significant in multi-byte d...
Definition: Memory.h:59
std::istream & operator>>(std::istream &is, ADF::FactoryItem &item)
Char_t * fBuffer
Definition: Buffer.h:67
Int_t fStatus
Definition: Buffer.h:64
Interface to the memory.
Definition: Memory.h:48
std::ostream & operator<<(std::ostream &os, const ADF::FactoryItem &item)
Int_t fEndian
Definition: Buffer.h:65
UInt_t fCurrent
Definition: Buffer.h:69
A buffer is used to read/write raw data buffers from/on files.
Definition: Buffer.h:43
const Int_t KBYTE
Definition: Memory.h:37
std::ostream & operator<<(std::ostream &out, const Parity &p)
to write a parity in a stream
Definition: Parity.cpp:93
void Swap()
Definition: BenchIO.C:32
UInt_t fSize
Definition: Buffer.h:68
A Endianbuffer is used to read/write raw data buffers from/on files.
Definition: Buffer.h:269