00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TBuffer
00013 #define ROOT_TBuffer
00014
00015
00017
00018
00019
00020
00021
00023
00024 #ifndef ROOT_TObject
00025 #include "TObject.h"
00026 #endif
00027 #ifndef ROOT_Bytes
00028 #include "Bytes.h"
00029 #endif
00030
00031 class TClass;
00032 class TExMap;
00033
00034 class TBuffer : public TObject {
00035
00036 protected:
00037 Bool_t fMode;
00038 Int_t fVersion;
00039 Int_t fBufSize;
00040 char *fBuffer;
00041 char *fBufCur;
00042 char *fBufMax;
00043 Int_t fMapCount;
00044 Int_t fMapSize;
00045 Int_t fDisplacement;
00046 TExMap *fMap;
00047 TExMap *fClassMap;
00048 TObject *fParent;
00049
00050 enum { kIsOwner = BIT(14) };
00051
00052 static Int_t fgMapSize;
00053
00054
00055 TBuffer() : fMode(0), fBuffer(0) { fMap = 0; fParent = 0;}
00056
00057
00058 TBuffer(const TBuffer &);
00059 void operator=(const TBuffer &);
00060
00061 void CheckCount(UInt_t offset);
00062 UInt_t CheckObject(UInt_t offset, const TClass *cl, Bool_t readClass = kFALSE);
00063
00064 void Expand(Int_t newsize);
00065
00066 Int_t Read(const char *name) { return TObject::Read(name); }
00067 Int_t Write(const char *name, Int_t opt, Int_t bufs)
00068 { return TObject::Write(name, opt, bufs); }
00069
00070 void WriteObject(const void *actualObjStart, TClass *actualClass);
00071
00072 public:
00073 enum EMode { kRead = 0, kWrite = 1 };
00074 enum { kInitialSize = 1024, kMinimalSize = 128 };
00075 enum { kMapSize = 503 };
00076
00077 TBuffer(EMode mode);
00078 TBuffer(EMode mode, Int_t bufsiz);
00079 TBuffer(EMode mode, Int_t bufsiz, void *buf, Bool_t adopt = kTRUE);
00080 virtual ~TBuffer();
00081
00082 void MapObject(const TObject *obj, UInt_t offset = 1);
00083 void MapObject(const void *obj, TClass *cl, UInt_t offset = 1);
00084 virtual void Reset() { SetBufferOffset(); ResetMap(); }
00085 void InitMap();
00086 void ResetMap();
00087 void SetReadMode();
00088 void SetReadParam(Int_t mapsize);
00089 void SetWriteMode();
00090 void SetWriteParam(Int_t mapsize);
00091 void SetBuffer(void *buf, UInt_t bufsiz = 0, Bool_t adopt = kTRUE);
00092 void SetBufferOffset(Int_t offset = 0) { fBufCur = fBuffer+offset; }
00093 void SetParent(TObject *parent);
00094 TObject *GetParent() const;
00095 char *Buffer() const { return fBuffer; }
00096 Int_t BufferSize() const { return fBufSize; }
00097 void DetachBuffer() { fBuffer = 0; }
00098 Int_t Length() const { return (Int_t)(fBufCur - fBuffer); }
00099
00100 Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss);
00101 void SetByteCount(UInt_t cntpos, Bool_t packInVersion = kFALSE);
00102
00103 Bool_t IsReading() const { return (fMode & kWrite) == 0; }
00104 Bool_t IsWriting() const { return (fMode & kWrite) != 0; }
00105
00106 Int_t ReadBuf(void *buf, Int_t max);
00107 void WriteBuf(const void *buf, Int_t max);
00108
00109 char *ReadString(char *s, Int_t max);
00110 void WriteString(const char *s);
00111
00112 Version_t ReadVersion(UInt_t *start = 0, UInt_t *bcnt = 0);
00113 UInt_t WriteVersion(const TClass *cl, Bool_t useBcnt = kFALSE);
00114
00115 virtual TClass *ReadClass(const TClass *cl = 0, UInt_t *objTag = 0);
00116 virtual void WriteClass(const TClass *cl);
00117
00118 virtual TObject *ReadObject(const TClass *cl);
00119 virtual void WriteObject(const TObject *obj);
00120
00121 void *ReadObjectAny(const TClass* cast);
00122 Int_t WriteObjectAny(const void *obj, TClass *ptrClass);
00123
00124 void SetBufferDisplacement(Int_t skipped)
00125 { fDisplacement = (Int_t)(Length() - skipped); }
00126 void SetBufferDisplacement() { fDisplacement = 0; }
00127 Int_t GetBufferDisplacement() const { return fDisplacement; }
00128
00129 Int_t ReadArray(Bool_t *&b);
00130 Int_t ReadArray(Char_t *&c);
00131 Int_t ReadArray(UChar_t *&c);
00132 Int_t ReadArray(Short_t *&h);
00133 Int_t ReadArray(UShort_t *&h);
00134 Int_t ReadArray(Int_t *&i);
00135 Int_t ReadArray(UInt_t *&i);
00136 Int_t ReadArray(Long_t *&l);
00137 Int_t ReadArray(ULong_t *&l);
00138 Int_t ReadArray(Long64_t *&l);
00139 Int_t ReadArray(ULong64_t *&l);
00140 Int_t ReadArray(Float_t *&f);
00141 Int_t ReadArray(Double_t *&d);
00142
00143 Int_t ReadStaticArray(Bool_t *b);
00144 Int_t ReadStaticArray(Char_t *c);
00145 Int_t ReadStaticArray(UChar_t *c);
00146 Int_t ReadStaticArray(Short_t *h);
00147 Int_t ReadStaticArray(UShort_t *h);
00148 Int_t ReadStaticArray(Int_t *i);
00149 Int_t ReadStaticArray(UInt_t *i);
00150 Int_t ReadStaticArray(Long_t *l);
00151 Int_t ReadStaticArray(ULong_t *l);
00152 Int_t ReadStaticArray(Long64_t *l);
00153 Int_t ReadStaticArray(ULong64_t *l);
00154 Int_t ReadStaticArray(Float_t *f);
00155 Int_t ReadStaticArray(Double_t *d);
00156
00157 void ReadFastArray(Bool_t *b, Int_t n);
00158 void ReadFastArray(Char_t *c, Int_t n);
00159 void ReadFastArray(UChar_t *c, Int_t n);
00160 void ReadFastArray(Short_t *h, Int_t n);
00161 void ReadFastArray(UShort_t *h, Int_t n);
00162 void ReadFastArray(Int_t *i, Int_t n);
00163 void ReadFastArray(UInt_t *i, Int_t n);
00164 void ReadFastArray(Long_t *l, Int_t n);
00165 void ReadFastArray(ULong_t *l, Int_t n);
00166 void ReadFastArray(Long64_t *l, Int_t n);
00167 void ReadFastArray(ULong64_t *l, Int_t n);
00168 void ReadFastArray(Float_t *f, Int_t n);
00169 void ReadFastArray(Double_t *d, Int_t n);
00170
00171 void WriteArray(const Bool_t *b, Int_t n);
00172 void WriteArray(const Char_t *c, Int_t n);
00173 void WriteArray(const UChar_t *c, Int_t n);
00174 void WriteArray(const Short_t *h, Int_t n);
00175 void WriteArray(const UShort_t *h, Int_t n);
00176 void WriteArray(const Int_t *i, Int_t n);
00177 void WriteArray(const UInt_t *i, Int_t n);
00178 void WriteArray(const Long_t *l, Int_t n);
00179 void WriteArray(const ULong_t *l, Int_t n);
00180 void WriteArray(const Long64_t *l, Int_t n);
00181 void WriteArray(const ULong64_t *l, Int_t n);
00182 void WriteArray(const Float_t *f, Int_t n);
00183 void WriteArray(const Double_t *d, Int_t n);
00184
00185 void WriteFastArray(const Bool_t *b, Int_t n);
00186 void WriteFastArray(const Char_t *c, Int_t n);
00187 void WriteFastArray(const UChar_t *c, Int_t n);
00188 void WriteFastArray(const Short_t *h, Int_t n);
00189 void WriteFastArray(const UShort_t *h, Int_t n);
00190 void WriteFastArray(const Int_t *i, Int_t n);
00191 void WriteFastArray(const UInt_t *i, Int_t n);
00192 void WriteFastArray(const Long_t *l, Int_t n);
00193 void WriteFastArray(const ULong_t *l, Int_t n);
00194 void WriteFastArray(const Long64_t *l, Int_t n);
00195 void WriteFastArray(const ULong64_t *l, Int_t n);
00196 void WriteFastArray(const Float_t *f, Int_t n);
00197 void WriteFastArray(const Double_t *d, Int_t n);
00198
00199 void StreamObject(void *obj, const type_info &typeinfo);
00200 void StreamObject(void *obj, const char *className);
00201 void StreamObject(void *obj, TClass *cl);
00202
00203 TBuffer &operator>>(Bool_t &b);
00204 TBuffer &operator>>(Char_t &c);
00205 TBuffer &operator>>(UChar_t &c);
00206 TBuffer &operator>>(Short_t &h);
00207 TBuffer &operator>>(UShort_t &h);
00208 TBuffer &operator>>(Int_t &i);
00209 TBuffer &operator>>(UInt_t &i);
00210 TBuffer &operator>>(Long_t &l);
00211 TBuffer &operator>>(ULong_t &l);
00212 TBuffer &operator>>(Long64_t &l);
00213 TBuffer &operator>>(ULong64_t &l);
00214 TBuffer &operator>>(Float_t &f);
00215 TBuffer &operator>>(Double_t &d);
00216 TBuffer &operator>>(Char_t *c);
00217
00218 TBuffer &operator<<(Bool_t b);
00219 TBuffer &operator<<(Char_t c);
00220 TBuffer &operator<<(UChar_t c);
00221 TBuffer &operator<<(Short_t h);
00222 TBuffer &operator<<(UShort_t h);
00223 TBuffer &operator<<(Int_t i);
00224 TBuffer &operator<<(UInt_t i);
00225 TBuffer &operator<<(Long_t l);
00226 TBuffer &operator<<(ULong_t l);
00227 TBuffer &operator<<(Long64_t l);
00228 TBuffer &operator<<(ULong64_t l);
00229 TBuffer &operator<<(Float_t f);
00230 TBuffer &operator<<(Double_t d);
00231 TBuffer &operator<<(const Char_t *c);
00232
00233
00234
00235
00236
00237 static void SetGlobalReadParam(Int_t mapsize);
00238 static void SetGlobalWriteParam(Int_t mapsize);
00239 static Int_t GetGlobalReadParam();
00240 static Int_t GetGlobalWriteParam();
00241 static TClass *GetClass(const type_info &typeinfo);
00242 static TClass *GetClass(const char *className);
00243
00244 ClassDef(TBuffer,0)
00245 };
00246
00247
00248
00249 #if !defined(R__CONCRETE_INPUT_OPERATOR)
00250 #ifndef __CINT__
00251
00252 #if defined(R__SOLARIS) && defined(R__GNU)
00253 #include <typeinfo>
00254 #endif
00255
00256 template <class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj)
00257 {
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 TClass *cl = TBuffer::GetClass(typeid(Tmpl));
00268 obj = (Tmpl *) ( (void*) buf.ReadObjectAny(cl) );
00269 return buf;
00270 }
00271
00272 template <class Tmpl> TBuffer &operator<<(TBuffer &buf, const Tmpl *obj)
00273 {
00274 TClass *cl = (obj) ? TBuffer::GetClass(typeid(*obj)) : 0;
00275 buf.WriteObjectAny(obj, cl);
00276 return buf;
00277 }
00278 #else
00279 template <class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj);
00280 template <class Tmpl> TBuffer &operator<<(TBuffer &buf, Tmpl *&obj);
00281 #endif
00282 #endif
00283
00284
00285
00286
00287
00288 inline TBuffer &TBuffer::operator<<(Bool_t b)
00289 {
00290 if (fBufCur + sizeof(UChar_t) > fBufMax) Expand(2*fBufSize);
00291
00292 tobuf(fBufCur, b);
00293 return *this;
00294 }
00295
00296
00297 inline TBuffer &TBuffer::operator<<(Char_t c)
00298 {
00299 if (fBufCur + sizeof(Char_t) > fBufMax) Expand(2*fBufSize);
00300
00301 tobuf(fBufCur, c);
00302 return *this;
00303 }
00304
00305
00306 inline TBuffer &TBuffer::operator<<(Short_t h)
00307 {
00308 if (fBufCur + sizeof(Short_t) > fBufMax) Expand(2*fBufSize);
00309
00310 tobuf(fBufCur, h);
00311 return *this;
00312 }
00313
00314
00315 inline TBuffer &TBuffer::operator<<(Int_t i)
00316 {
00317 if (fBufCur + sizeof(Int_t) > fBufMax) Expand(2*fBufSize);
00318
00319 tobuf(fBufCur, i);
00320 return *this;
00321 }
00322
00323
00324 inline TBuffer &TBuffer::operator<<(Long_t l)
00325 {
00326 if (fBufCur + sizeof(Long_t) > fBufMax) Expand(2*fBufSize);
00327
00328 tobuf(fBufCur, l);
00329 return *this;
00330 }
00331
00332
00333 inline TBuffer &TBuffer::operator<<(ULong_t l)
00334 {
00335 if (fBufCur + sizeof(ULong_t) > fBufMax) Expand(2*fBufSize);
00336
00337 tobuf(fBufCur, l);
00338 return *this;
00339 }
00340
00341
00342 inline TBuffer &TBuffer::operator<<(Long64_t ll)
00343 {
00344 if (fBufCur + sizeof(Long64_t) > fBufMax) Expand(2*fBufSize);
00345
00346 tobuf(fBufCur, ll);
00347 return *this;
00348 }
00349
00350
00351 inline TBuffer &TBuffer::operator<<(Float_t f)
00352 {
00353 if (fBufCur + sizeof(Float_t) > fBufMax) Expand(2*fBufSize);
00354
00355 tobuf(fBufCur, f);
00356 return *this;
00357 }
00358
00359
00360 inline TBuffer &TBuffer::operator<<(Double_t d)
00361 {
00362 if (fBufCur + sizeof(Double_t) > fBufMax) Expand(2*fBufSize);
00363
00364 tobuf(fBufCur, d);
00365 return *this;
00366 }
00367
00368
00369 inline TBuffer &TBuffer::operator<<(const Char_t *c)
00370 {
00371 WriteString(c);
00372 return *this;
00373 }
00374
00375
00376 inline TBuffer &TBuffer::operator>>(Bool_t &b)
00377 {
00378 frombuf(fBufCur, &b);
00379 return *this;
00380 }
00381
00382
00383 inline TBuffer &TBuffer::operator>>(Char_t &c)
00384 {
00385 frombuf(fBufCur, &c);
00386 return *this;
00387 }
00388
00389
00390 inline TBuffer &TBuffer::operator>>(Short_t &h)
00391 {
00392 frombuf(fBufCur, &h);
00393 return *this;
00394 }
00395
00396
00397 inline TBuffer &TBuffer::operator>>(Int_t &i)
00398 {
00399 frombuf(fBufCur, &i);
00400 return *this;
00401 }
00402
00403
00404
00405
00406 inline TBuffer &TBuffer::operator>>(Long64_t &ll)
00407 {
00408 frombuf(fBufCur, &ll);
00409 return *this;
00410 }
00411
00412
00413 inline TBuffer &TBuffer::operator>>(Float_t &f)
00414 {
00415 frombuf(fBufCur, &f);
00416 return *this;
00417 }
00418
00419
00420 inline TBuffer &TBuffer::operator>>(Double_t &d)
00421 {
00422 frombuf(fBufCur, &d);
00423 return *this;
00424 }
00425
00426
00427 inline TBuffer &TBuffer::operator>>(Char_t *c)
00428 {
00429 ReadString(c, -1);
00430 return *this;
00431 }
00432
00433
00434 inline TBuffer &TBuffer::operator<<(UChar_t c)
00435 { return TBuffer::operator<<((Char_t)c); }
00436
00437 inline TBuffer &TBuffer::operator<<(UShort_t h)
00438 { return TBuffer::operator<<((Short_t)h); }
00439
00440 inline TBuffer &TBuffer::operator<<(UInt_t i)
00441 { return TBuffer::operator<<((Int_t)i); }
00442
00443 inline TBuffer &TBuffer::operator<<(ULong64_t ll)
00444 { return TBuffer::operator<<((Long64_t)ll); }
00445
00446
00447 inline TBuffer &TBuffer::operator>>(UChar_t &c)
00448 { return TBuffer::operator>>((Char_t&)c); }
00449
00450 inline TBuffer &TBuffer::operator>>(UShort_t &h)
00451 { return TBuffer::operator>>((Short_t&)h); }
00452
00453 inline TBuffer &TBuffer::operator>>(UInt_t &i)
00454 { return TBuffer::operator>>((Int_t&)i); }
00455
00456 inline TBuffer &TBuffer::operator>>(ULong_t &l)
00457 { return TBuffer::operator>>((Long_t&)l); }
00458
00459 inline TBuffer &TBuffer::operator>>(ULong64_t &ll)
00460 { return TBuffer::operator>>((Long64_t&)ll); }
00461
00462
00463 #if defined(R__TEMPLATE_OVERLOAD_BUG)
00464 template <>
00465 #endif
00466 inline TBuffer &operator<<(TBuffer &buf, const TObject *obj)
00467 { buf.WriteObjectAny(obj,TObject::Class());
00468 return buf; }
00469
00470
00471
00472
00473
00474
00475
00476
00477 inline Int_t TBuffer::ReadArray(UChar_t *&c)
00478 { return TBuffer::ReadArray((Char_t *&)c); }
00479
00480 inline Int_t TBuffer::ReadArray(UShort_t *&h)
00481 { return TBuffer::ReadArray((Short_t *&)h); }
00482
00483 inline Int_t TBuffer::ReadArray(UInt_t *&i)
00484 { return TBuffer::ReadArray((Int_t *&)i); }
00485
00486 inline Int_t TBuffer::ReadArray(ULong_t *&l)
00487 { return TBuffer::ReadArray((Long_t *&)l); }
00488
00489 inline Int_t TBuffer::ReadArray(ULong64_t *&ll)
00490 { return TBuffer::ReadArray((Long64_t *&)ll); }
00491
00492
00493 inline Int_t TBuffer::ReadStaticArray(UChar_t *c)
00494 { return TBuffer::ReadStaticArray((Char_t *)c); }
00495
00496 inline Int_t TBuffer::ReadStaticArray(UShort_t *h)
00497 { return TBuffer::ReadStaticArray((Short_t *)h); }
00498
00499 inline Int_t TBuffer::ReadStaticArray(UInt_t *i)
00500 { return TBuffer::ReadStaticArray((Int_t *)i); }
00501
00502 inline Int_t TBuffer::ReadStaticArray(ULong_t *l)
00503 { return TBuffer::ReadStaticArray((Long_t *)l); }
00504
00505 inline Int_t TBuffer::ReadStaticArray(ULong64_t *ll)
00506 { return TBuffer::ReadStaticArray((Long64_t *)ll); }
00507
00508
00509 inline void TBuffer::ReadFastArray(UChar_t *c, Int_t n)
00510 { TBuffer::ReadFastArray((Char_t *)c, n); }
00511
00512 inline void TBuffer::ReadFastArray(UShort_t *h, Int_t n)
00513 { TBuffer::ReadFastArray((Short_t *)h, n); }
00514
00515 inline void TBuffer::ReadFastArray(UInt_t *i, Int_t n)
00516 { TBuffer::ReadFastArray((Int_t *)i, n); }
00517
00518 inline void TBuffer::ReadFastArray(ULong_t *l, Int_t n)
00519 { TBuffer::ReadFastArray((Long_t *)l, n); }
00520
00521 inline void TBuffer::ReadFastArray(ULong64_t *ll, Int_t n)
00522 { TBuffer::ReadFastArray((Long64_t *)ll, n); }
00523
00524
00525 inline void TBuffer::WriteArray(const UChar_t *c, Int_t n)
00526 { TBuffer::WriteArray((const Char_t *)c, n); }
00527
00528 inline void TBuffer::WriteArray(const UShort_t *h, Int_t n)
00529 { TBuffer::WriteArray((const Short_t *)h, n); }
00530
00531 inline void TBuffer::WriteArray(const UInt_t *i, Int_t n)
00532 { TBuffer::WriteArray((const Int_t *)i, n); }
00533
00534 inline void TBuffer::WriteArray(const ULong64_t *ll, Int_t n)
00535 { TBuffer::WriteArray((const Long64_t *)ll, n); }
00536
00537
00538 inline void TBuffer::WriteFastArray(const UChar_t *c, Int_t n)
00539 { TBuffer::WriteFastArray((const Char_t *)c, n); }
00540
00541 inline void TBuffer::WriteFastArray(const UShort_t *h, Int_t n)
00542 { TBuffer::WriteFastArray((const Short_t *)h, n); }
00543
00544 inline void TBuffer::WriteFastArray(const UInt_t *i, Int_t n)
00545 { TBuffer::WriteFastArray((const Int_t *)i, n); }
00546
00547 inline void TBuffer::WriteFastArray(const ULong64_t *ll, Int_t n)
00548 { TBuffer::WriteFastArray((const Long64_t *)ll, n); }
00549
00550 #endif