31 class TVirtualStreamerInfo;
32 class TStreamerElement;
38 namespace TStreamerInfoActions {
39 class TActionSequence;
42 class TBuffer :
public TObject {
45 typedef std::vector<TVirtualArray*> CacheList_t;
54 ReAllocCharFun_t fReAllocFunc;
55 CacheList_t fCacheStack;
58 TBuffer() : TObject(), fMode(0), fVersion(0), fBufSize(0), fBuffer(0),
59 fBufCur(0), fBufMax(0), fParent(0), fReAllocFunc(0), fCacheStack(0,(TVirtualArray*)0) {}
62 TBuffer(
const TBuffer &);
63 void operator=(
const TBuffer &);
65 Int_t Read(
const char *name) {
return TObject::Read(name); }
66 Int_t Write(
const char *name, Int_t opt, Int_t bufs)
67 {
return TObject::Write(name, opt, bufs); }
68 Int_t Write(
const char *name, Int_t opt, Int_t bufs)
const
69 {
return TObject::Write(name, opt, bufs); }
72 enum EMode { kRead = 0, kWrite = 1 };
75 kCannotHandleMemberWiseStreaming = BIT(17)
77 enum { kInitialSize = 1024, kMinimalSize = 128 };
80 TBuffer(EMode mode, Int_t bufsiz);
81 TBuffer(EMode mode, Int_t bufsiz,
void *buf, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = 0);
84 Int_t GetBufferVersion()
const {
return fVersion; }
85 Bool_t IsReading()
const {
return (fMode & kWrite) == 0; }
86 Bool_t IsWriting()
const {
return (fMode & kWrite) != 0; }
89 void SetBuffer(
void *buf, UInt_t bufsiz = 0, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = 0);
90 ReAllocCharFun_t GetReAllocFunc()
const;
91 void SetReAllocFunc(ReAllocCharFun_t reallocfunc = 0);
92 void SetBufferOffset(Int_t offset = 0) { fBufCur = fBuffer+offset; }
93 void SetParent(TObject *parent);
94 TObject *GetParent()
const;
95 char *Buffer()
const {
return fBuffer; }
96 char *GetCurrent()
const {
return fBufCur; }
97 Int_t BufferSize()
const {
return fBufSize; }
98 void DetachBuffer() { fBuffer = 0; }
99 Int_t Length()
const {
return (Int_t)(fBufCur - fBuffer); }
100 void Expand(Int_t newsize, Bool_t copy = kTRUE);
101 void AutoExpand(Int_t size_needed);
102 Bool_t ByteSwapBuffer(Long64_t n, EDataType type);
104 virtual Bool_t CheckObject(
const TObject *obj) = 0;
105 virtual Bool_t CheckObject(
const void *obj,
const TClass *ptrClass) = 0;
107 virtual Int_t ReadBuf(
void *buf, Int_t max) = 0;
108 virtual void WriteBuf(
const void *buf, Int_t max) = 0;
110 virtual char *ReadString(
char *s, Int_t max) = 0;
111 virtual void WriteString(
const char *s) = 0;
113 virtual Int_t GetVersionOwner()
const = 0;
114 virtual Int_t GetMapCount()
const = 0;
115 virtual void GetMappedObject(UInt_t tag,
void* &ptr, TClass* &ClassPtr)
const = 0;
116 virtual void MapObject(
const TObject *obj, UInt_t offset = 1) = 0;
117 virtual void MapObject(
const void *obj,
const TClass *cl, UInt_t offset = 1) = 0;
118 virtual void Reset() = 0;
119 virtual void InitMap() = 0;
120 virtual void ResetMap() = 0;
121 virtual void SetReadParam(Int_t mapsize) = 0;
122 virtual void SetWriteParam(Int_t mapsize) = 0;
124 virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt,
const TClass *clss) = 0;
125 virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt,
const char *classname) = 0;
126 virtual void SetByteCount(UInt_t cntpos, Bool_t packInVersion = kFALSE)= 0;
128 virtual void SkipVersion(
const TClass *cl = 0) = 0;
129 virtual Version_t ReadVersion(UInt_t *start = 0, UInt_t *bcnt = 0,
const TClass *cl = 0) = 0;
130 virtual Version_t ReadVersionNoCheckSum(UInt_t *start = 0, UInt_t *bcnt = 0) = 0;
131 virtual Version_t ReadVersionForMemberWise(
const TClass *cl = 0) = 0;
132 virtual UInt_t WriteVersion(
const TClass *cl, Bool_t useBcnt = kFALSE) = 0;
133 virtual UInt_t WriteVersionMemberWise(
const TClass *cl, Bool_t useBcnt = kFALSE) = 0;
135 virtual void *ReadObjectAny(
const TClass* cast) = 0;
136 virtual void SkipObjectAny() = 0;
138 virtual void TagStreamerInfo(TVirtualStreamerInfo* info) = 0;
139 virtual void IncrementLevel(TVirtualStreamerInfo* info) = 0;
140 virtual void SetStreamerElementNumber(TStreamerElement *elem, Int_t comp_type) = 0;
141 virtual void DecrementLevel(TVirtualStreamerInfo*) = 0;
143 virtual void ClassBegin(
const TClass*, Version_t = -1) = 0;
144 virtual void ClassEnd(
const TClass*) = 0;
145 virtual void ClassMember(
const char*,
const char* = 0, Int_t = -1, Int_t = -1) = 0;
146 virtual TVirtualStreamerInfo *GetInfo() = 0;
148 virtual TVirtualArray *PeekDataCache()
const;
149 virtual TVirtualArray *PopDataCache();
150 virtual void PushDataCache(TVirtualArray *);
152 virtual TClass *ReadClass(
const TClass *cl = 0, UInt_t *objTag = 0) = 0;
153 virtual void WriteClass(
const TClass *cl) = 0;
155 virtual TObject *ReadObject(
const TClass *cl) = 0;
156 virtual void WriteObject(
const TObject *obj, Bool_t cacheReuse) = 0;
158 template <
class T> Int_t WriteObject(
const T *objptr, Bool_t cacheReuse = kTRUE);
160 virtual Int_t WriteObjectAny(
const void *obj,
const TClass *ptrClass, Bool_t cacheReuse = kTRUE) = 0;
162 virtual UShort_t GetPidOffset()
const = 0;
163 virtual void SetPidOffset(UShort_t offset) = 0;
164 virtual Int_t GetBufferDisplacement()
const = 0;
165 virtual void SetBufferDisplacement() = 0;
166 virtual void SetBufferDisplacement(Int_t skipped) = 0;
169 virtual void ReadFloat16 (Float_t *f, TStreamerElement *ele=0) = 0;
170 virtual void WriteFloat16(Float_t *f, TStreamerElement *ele=0) = 0;
171 virtual void ReadDouble32 (Double_t *d, TStreamerElement *ele=0) = 0;
172 virtual void WriteDouble32(Double_t *d, TStreamerElement *ele=0) = 0;
173 virtual void ReadWithFactor(Float_t *ptr, Double_t factor, Double_t minvalue) = 0;
174 virtual void ReadWithNbits(Float_t *ptr, Int_t nbits) = 0;
175 virtual void ReadWithFactor(Double_t *ptr, Double_t factor, Double_t minvalue) = 0;
176 virtual void ReadWithNbits(Double_t *ptr, Int_t nbits) = 0;
178 virtual Int_t ReadArray(Bool_t *&b) = 0;
179 virtual Int_t ReadArray(Char_t *&c) = 0;
180 virtual Int_t ReadArray(UChar_t *&c) = 0;
181 virtual Int_t ReadArray(Short_t *&h) = 0;
182 virtual Int_t ReadArray(UShort_t *&h) = 0;
183 virtual Int_t ReadArray(Int_t *&i) = 0;
184 virtual Int_t ReadArray(UInt_t *&i) = 0;
185 virtual Int_t ReadArray(Long_t *&l) = 0;
186 virtual Int_t ReadArray(ULong_t *&l) = 0;
187 virtual Int_t ReadArray(Long64_t *&l) = 0;
188 virtual Int_t ReadArray(ULong64_t *&l) = 0;
189 virtual Int_t ReadArray(Float_t *&f) = 0;
190 virtual Int_t ReadArray(Double_t *&d) = 0;
191 virtual Int_t ReadArrayFloat16(Float_t *&f, TStreamerElement *ele=0) = 0;
192 virtual Int_t ReadArrayDouble32(Double_t *&d, TStreamerElement *ele=0) = 0;
194 virtual Int_t ReadStaticArray(Bool_t *b) = 0;
195 virtual Int_t ReadStaticArray(Char_t *c) = 0;
196 virtual Int_t ReadStaticArray(UChar_t *c) = 0;
197 virtual Int_t ReadStaticArray(Short_t *h) = 0;
198 virtual Int_t ReadStaticArray(UShort_t *h) = 0;
199 virtual Int_t ReadStaticArray(Int_t *i) = 0;
200 virtual Int_t ReadStaticArray(UInt_t *i) = 0;
201 virtual Int_t ReadStaticArray(Long_t *l) = 0;
202 virtual Int_t ReadStaticArray(ULong_t *l) = 0;
203 virtual Int_t ReadStaticArray(Long64_t *l) = 0;
204 virtual Int_t ReadStaticArray(ULong64_t *l) = 0;
205 virtual Int_t ReadStaticArray(Float_t *f) = 0;
206 virtual Int_t ReadStaticArray(Double_t *d) = 0;
207 virtual Int_t ReadStaticArrayFloat16(Float_t *f, TStreamerElement *ele=0) = 0;
208 virtual Int_t ReadStaticArrayDouble32(Double_t *d, TStreamerElement *ele=0) = 0;
210 virtual void ReadFastArray(Bool_t *b, Int_t n) = 0;
211 virtual void ReadFastArray(Char_t *c, Int_t n) = 0;
212 virtual void ReadFastArrayString(Char_t *c, Int_t n) = 0;
213 virtual void ReadFastArray(UChar_t *c, Int_t n) = 0;
214 virtual void ReadFastArray(Short_t *h, Int_t n) = 0;
215 virtual void ReadFastArray(UShort_t *h, Int_t n) = 0;
216 virtual void ReadFastArray(Int_t *i, Int_t n) = 0;
217 virtual void ReadFastArray(UInt_t *i, Int_t n) = 0;
218 virtual void ReadFastArray(Long_t *l, Int_t n) = 0;
219 virtual void ReadFastArray(ULong_t *l, Int_t n) = 0;
220 virtual void ReadFastArray(Long64_t *l, Int_t n) = 0;
221 virtual void ReadFastArray(ULong64_t *l, Int_t n) = 0;
222 virtual void ReadFastArray(Float_t *f, Int_t n) = 0;
223 virtual void ReadFastArray(Double_t *d, Int_t n) = 0;
224 virtual void ReadFastArrayFloat16(Float_t *f, Int_t n, TStreamerElement *ele=0) = 0;
225 virtual void ReadFastArrayDouble32(Double_t *d, Int_t n, TStreamerElement *ele=0) = 0;
226 virtual void ReadFastArrayWithFactor(Float_t *ptr, Int_t n, Double_t factor, Double_t minvalue) = 0;
227 virtual void ReadFastArrayWithNbits(Float_t *ptr, Int_t n, Int_t nbits) = 0;
228 virtual void ReadFastArrayWithFactor(Double_t *ptr, Int_t n, Double_t factor, Double_t minvalue) = 0;
229 virtual void ReadFastArrayWithNbits(Double_t *ptr, Int_t n, Int_t nbits) = 0;
230 virtual void ReadFastArray(
void *start ,
const TClass *cl, Int_t n=1, TMemberStreamer *s=0,
const TClass *onFileClass=0) = 0;
231 virtual void ReadFastArray(
void **startp,
const TClass *cl, Int_t n=1, Bool_t isPreAlloc=kFALSE, TMemberStreamer *s=0,
const TClass *onFileClass=0) = 0;
233 virtual void WriteArray(
const Bool_t *b, Int_t n) = 0;
234 virtual void WriteArray(
const Char_t *c, Int_t n) = 0;
235 virtual void WriteArray(
const UChar_t *c, Int_t n) = 0;
236 virtual void WriteArray(
const Short_t *h, Int_t n) = 0;
237 virtual void WriteArray(
const UShort_t *h, Int_t n) = 0;
238 virtual void WriteArray(
const Int_t *i, Int_t n) = 0;
239 virtual void WriteArray(
const UInt_t *i, Int_t n) = 0;
240 virtual void WriteArray(
const Long_t *l, Int_t n) = 0;
241 virtual void WriteArray(
const ULong_t *l, Int_t n) = 0;
242 virtual void WriteArray(
const Long64_t *l, Int_t n) = 0;
243 virtual void WriteArray(
const ULong64_t *l, Int_t n) = 0;
244 virtual void WriteArray(
const Float_t *f, Int_t n) = 0;
245 virtual void WriteArray(
const Double_t *d, Int_t n) = 0;
246 virtual void WriteArrayFloat16(
const Float_t *f, Int_t n, TStreamerElement *ele=0) = 0;
247 virtual void WriteArrayDouble32(
const Double_t *d, Int_t n, TStreamerElement *ele=0) = 0;
249 virtual void WriteFastArray(
const Bool_t *b, Int_t n) = 0;
250 virtual void WriteFastArray(
const Char_t *c, Int_t n) = 0;
251 virtual void WriteFastArrayString(
const Char_t *c, Int_t n) = 0;
252 virtual void WriteFastArray(
const UChar_t *c, Int_t n) = 0;
253 virtual void WriteFastArray(
const Short_t *h, Int_t n) = 0;
254 virtual void WriteFastArray(
const UShort_t *h, Int_t n) = 0;
255 virtual void WriteFastArray(
const Int_t *i, Int_t n) = 0;
256 virtual void WriteFastArray(
const UInt_t *i, Int_t n) = 0;
257 virtual void WriteFastArray(
const Long_t *l, Int_t n) = 0;
258 virtual void WriteFastArray(
const ULong_t *l, Int_t n) = 0;
259 virtual void WriteFastArray(
const Long64_t *l, Int_t n) = 0;
260 virtual void WriteFastArray(
const ULong64_t *l, Int_t n) = 0;
261 virtual void WriteFastArray(
const Float_t *f, Int_t n) = 0;
262 virtual void WriteFastArray(
const Double_t *d, Int_t n) = 0;
263 virtual void WriteFastArrayFloat16(
const Float_t *f, Int_t n, TStreamerElement *ele=0) = 0;
264 virtual void WriteFastArrayDouble32(
const Double_t *d, Int_t n, TStreamerElement *ele=0) = 0;
265 virtual void WriteFastArray(
void *start,
const TClass *cl, Int_t n=1, TMemberStreamer *s=0) = 0;
266 virtual Int_t WriteFastArray(
void **startp,
const TClass *cl, Int_t n=1, Bool_t isPreAlloc=kFALSE, TMemberStreamer *s=0) = 0;
268 virtual void StreamObject(
void *obj,
const std::type_info &typeinfo,
const TClass* onFileClass = 0 ) = 0;
269 virtual void StreamObject(
void *obj,
const char *className,
const TClass* onFileClass = 0 ) = 0;
270 virtual void StreamObject(
void *obj,
const TClass *cl,
const TClass* onFileClass = 0 ) = 0;
271 virtual void StreamObject(TObject *obj) = 0;
273 virtual void ReadBool(Bool_t &b) = 0;
274 virtual void ReadChar(Char_t &c) = 0;
275 virtual void ReadUChar(UChar_t &c) = 0;
276 virtual void ReadShort(Short_t &s) = 0;
277 virtual void ReadUShort(UShort_t &s) = 0;
278 virtual void ReadInt(Int_t &i) = 0;
279 virtual void ReadUInt(UInt_t &i) = 0;
280 virtual void ReadLong(Long_t &l) = 0;
281 virtual void ReadULong(ULong_t &l) = 0;
282 virtual void ReadLong64(Long64_t &l) = 0;
283 virtual void ReadULong64(ULong64_t &l) = 0;
284 virtual void ReadFloat(Float_t &f) = 0;
285 virtual void ReadDouble(Double_t &d) = 0;
286 virtual void ReadCharP(Char_t *c) = 0;
287 virtual void ReadTString(TString &s) = 0;
288 virtual void ReadStdString(std::string *s) = 0;
289 virtual void ReadCharStar(
char* &s) = 0;
291 virtual inline void ReadStdString(std::string &s) { ReadStdString(&s); }
293 virtual void WriteBool(Bool_t b) = 0;
294 virtual void WriteChar(Char_t c) = 0;
295 virtual void WriteUChar(UChar_t c) = 0;
296 virtual void WriteShort(Short_t s) = 0;
297 virtual void WriteUShort(UShort_t s) = 0;
298 virtual void WriteInt(Int_t i) = 0;
299 virtual void WriteUInt(UInt_t i) = 0;
300 virtual void WriteLong(Long_t l) = 0;
301 virtual void WriteULong(ULong_t l) = 0;
302 virtual void WriteLong64(Long64_t l) = 0;
303 virtual void WriteULong64(ULong64_t l) = 0;
304 virtual void WriteFloat(Float_t f) = 0;
305 virtual void WriteDouble(Double_t d) = 0;
306 virtual void WriteCharP(
const Char_t *c) = 0;
307 virtual void WriteTString(
const TString &s) = 0;
308 virtual void WriteStdString(
const std::string *s) = 0;
309 virtual void WriteCharStar(
char *s) = 0;
311 virtual inline void WriteStdString(std::string &s) { WriteStdString(&s); }
314 virtual TProcessID *GetLastProcessID(TRefTable *reftable)
const = 0;
315 virtual UInt_t GetTRefExecId() = 0;
316 virtual TProcessID *ReadProcessID(UShort_t pidf) = 0;
317 virtual UShort_t WriteProcessID(TProcessID *pid) = 0;
320 virtual void ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t force) = 0;
321 virtual void ForceWriteInfoClones(TClonesArray *a) = 0;
322 virtual Int_t ReadClones (TClonesArray *a, Int_t nobjects, Version_t objvers) = 0;
323 virtual Int_t WriteClones(TClonesArray *a, Int_t nobjects) = 0;
326 virtual Int_t ReadClassEmulated(
const TClass *cl,
void *
object,
const TClass *onfile_class = 0) = 0;
327 virtual Int_t ReadClassBuffer(
const TClass *cl,
void *pointer,
const TClass *onfile_class = 0) = 0;
328 virtual Int_t ReadClassBuffer(
const TClass *cl,
void *pointer, Int_t version, UInt_t start, UInt_t count,
const TClass *onfile_class = 0) = 0;
329 virtual Int_t WriteClassBuffer(
const TClass *cl,
void *pointer) = 0;
332 virtual Int_t ApplySequence(
const TStreamerInfoActions::TActionSequence &sequence,
void *
object) = 0;
333 virtual Int_t ApplySequenceVecPtr(
const TStreamerInfoActions::TActionSequence &sequence,
void *start_collection,
void *end_collection) = 0;
334 virtual Int_t ApplySequence(
const TStreamerInfoActions::TActionSequence &sequence,
void *start_collection,
void *end_collection) = 0;
336 static TClass *GetClass(
const std::type_info &typeinfo);
337 static TClass *GetClass(
const char *className);
344 inline TBuffer &operator>>(TBuffer &buf, Bool_t &b) { buf.ReadBool(b);
return buf; }
345 inline TBuffer &operator>>(TBuffer &buf, Char_t &c) { buf.ReadChar(c);
return buf; }
346 inline TBuffer &operator>>(TBuffer &buf, UChar_t &c) { buf.ReadUChar(c);
return buf; }
347 inline TBuffer &operator>>(TBuffer &buf, Short_t &s) { buf.ReadShort(s);
return buf; }
348 inline TBuffer &operator>>(TBuffer &buf, UShort_t &s) { buf.ReadUShort(s);
return buf; }
349 inline TBuffer &operator>>(TBuffer &buf, Int_t &i) { buf.ReadInt(i);
return buf; }
350 inline TBuffer &operator>>(TBuffer &buf, UInt_t &i) { buf.ReadUInt(i);
return buf; }
351 inline TBuffer &operator>>(TBuffer &buf, Long_t &l) { buf.ReadLong(l);
return buf; }
352 inline TBuffer &operator>>(TBuffer &buf, ULong_t &l) { buf.ReadULong(l);
return buf; }
353 inline TBuffer &operator>>(TBuffer &buf, Long64_t &l) { buf.ReadLong64(l);
return buf; }
354 inline TBuffer &operator>>(TBuffer &buf, ULong64_t &l){ buf.ReadULong64(l);
return buf; }
355 inline TBuffer &operator>>(TBuffer &buf, Float_t &f) { buf.ReadFloat(f);
return buf; }
356 inline TBuffer &operator>>(TBuffer &buf, Double_t &d) { buf.ReadDouble(d);
return buf; }
357 inline TBuffer &operator>>(TBuffer &buf, Char_t *c) { buf.ReadCharP(c);
return buf; }
358 inline TBuffer &operator>>(TBuffer &buf, TString &s) { buf.ReadTString(s);
return buf; }
360 inline TBuffer &operator<<(TBuffer &buf, Bool_t b) { buf.WriteBool(b);
return buf; }
361 inline TBuffer &operator<<(TBuffer &buf, Char_t c) { buf.WriteChar(c);
return buf; }
362 inline TBuffer &operator<<(TBuffer &buf, UChar_t c) { buf.WriteUChar(c);
return buf; }
363 inline TBuffer &operator<<(TBuffer &buf, Short_t s) { buf.WriteShort(s);
return buf; }
364 inline TBuffer &operator<<(TBuffer &buf, UShort_t s) { buf.WriteUShort(s);
return buf; }
365 inline TBuffer &operator<<(TBuffer &buf, Int_t i) { buf.WriteInt(i);
return buf; }
366 inline TBuffer &operator<<(TBuffer &buf, UInt_t i) { buf.WriteUInt(i);
return buf; }
367 inline TBuffer &operator<<(TBuffer &buf, Long_t l) { buf.WriteLong(l);
return buf; }
368 inline TBuffer &operator<<(TBuffer &buf, ULong_t l) { buf.WriteULong(l);
return buf; }
369 inline TBuffer &operator<<(TBuffer &buf, Long64_t l) { buf.WriteLong64(l);
return buf; }
370 inline TBuffer &operator<<(TBuffer &buf, ULong64_t l){ buf.WriteULong64(l);
return buf; }
371 inline TBuffer &operator<<(TBuffer &buf, Float_t f) { buf.WriteFloat(f);
return buf; }
372 inline TBuffer &operator<<(TBuffer &buf, Double_t d) { buf.WriteDouble(d);
return buf; }
373 inline TBuffer &operator<<(TBuffer &buf,
const Char_t *c) { buf.WriteCharP(c);
return buf; }
374 inline TBuffer &operator<<(TBuffer &buf,
const TString &s) { buf.WriteTString(s);
return buf; }
378 #if defined(R__SOLARIS) && defined(R__GNU)
382 template <
class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj)
393 auto cl = TClass::GetClass<Tmpl>();
394 obj = (Tmpl *) ( (
void*) buf.ReadObjectAny(cl) );
398 template <
class Tmpl> TBuffer &operator<<(TBuffer &buf,
const Tmpl *obj)
400 auto cl = (obj) ? TClass::GetClass<Tmpl>() :
nullptr;
401 buf.WriteObjectAny(obj, cl);
405 template <
class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj);
406 template <
class Tmpl> TBuffer &operator<<(TBuffer &buf, Tmpl *&obj);
410 inline Int_t TBuffer::WriteObject(
const T *objptr, Bool_t cacheReuse)
412 auto cl = (objptr) ? TClass::GetClass<T>() :
nullptr;
413 return WriteObjectAny(objptr, cl, cacheReuse);
416 #endif // ROOT_TBuffer