1    	// @(#)root/base:$Id$
2    	// Author: Rene Brun, Philippe Canal, Fons Rademakers   04/05/96
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
6    	 * All rights reserved.                                                  *
7    	 *                                                                       *
8    	 * For the licensing terms see $ROOTSYS/LICENSE.                         *
9    	 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
10   	 *************************************************************************/
11   	
12   	#ifndef ROOT_TBuffer
13   	#define ROOT_TBuffer
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TBuffer                                                              //
19   	//                                                                      //
20   	// Buffer base class used for serializing objects.                      //
21   	//                                                                      //
22   	//////////////////////////////////////////////////////////////////////////
23   	
24   	#ifndef ROOT_TObject
25   	#include "TObject.h"
26   	#endif
27   	
28   	class TVirtualStreamerInfo;
29   	class TStreamerElement;
30   	class TClass;
31   	class TString;
32   	class TProcessID;
33   	class TClonesArray;
34   	class TRefTable;
35   	class TVirtualArray;
36   	namespace TStreamerInfoActions {
37   	   class TActionSequence;
38   	}
39   	
40   	class TBuffer : public TObject {
41   	
42   	protected:
43   	   typedef std::vector<TVirtualArray*> CacheList_t;
44   	
45   	   Bool_t           fMode;          //Read or write mode
46   	   Int_t            fVersion;       //Buffer format version
47   	   Int_t            fBufSize;       //Size of buffer
48   	   char            *fBuffer;        //Buffer used to store objects
49   	   char            *fBufCur;        //Current position in buffer
50   	   char            *fBufMax;        //End of buffer
51   	   TObject         *fParent;        //Pointer to parent object owning this buffer
52   	   ReAllocCharFun_t fReAllocFunc;   //! Realloc function to be used when extending the buffer.
53   	   CacheList_t      fCacheStack;    //Stack of pointers to the cache where to temporarily store the value of 'missing' data members
54   	
55   	   // Default ctor
56   	   TBuffer() : TObject(), fMode(0), fVersion(0), fBufSize(0), fBuffer(0),
57   	     fBufCur(0), fBufMax(0), fParent(0), fReAllocFunc(0), fCacheStack(0,(TVirtualArray*)0) {}
58   	
59   	   // TBuffer objects cannot be copied or assigned
60   	   TBuffer(const TBuffer &);           // not implemented
61   	   void operator=(const TBuffer &);    // not implemented
62   	
63   	   Int_t Read(const char *name) { return TObject::Read(name); }
64   	   Int_t Write(const char *name, Int_t opt, Int_t bufs)
65   	                              { return TObject::Write(name, opt, bufs); }
66   	   Int_t Write(const char *name, Int_t opt, Int_t bufs) const
67   	                              { return TObject::Write(name, opt, bufs); }
68   	
69   	public:
70   	   enum EMode { kRead = 0, kWrite = 1 };
71   	   enum { kIsOwner = BIT(16) };                        //if set TBuffer owns fBuffer
72   	   enum { kCannotHandleMemberWiseStreaming = BIT(17)}; //if set TClonesArray should not use member wise streaming
73   	   enum { kInitialSize = 1024, kMinimalSize = 128 };
74   	
75   	   TBuffer(EMode mode);
76   	   TBuffer(EMode mode, Int_t bufsiz);
77   	   TBuffer(EMode mode, Int_t bufsiz, void *buf, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = 0);
78   	   virtual ~TBuffer();
79   	
80   	   Int_t    GetBufferVersion() const { return fVersion; }
81   	   Bool_t   IsReading() const { return (fMode & kWrite) == 0; }
82   	   Bool_t   IsWriting() const { return (fMode & kWrite) != 0; }
83   	   void     SetReadMode();
84   	   void     SetWriteMode();
85   	   void     SetBuffer(void *buf, UInt_t bufsiz = 0, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = 0);
86   	   ReAllocCharFun_t GetReAllocFunc() const;
87   	   void     SetReAllocFunc(ReAllocCharFun_t reallocfunc = 0);
88   	   void     SetBufferOffset(Int_t offset = 0) { fBufCur = fBuffer+offset; }
89   	   void     SetParent(TObject *parent);
90   	   TObject *GetParent()  const;
91   	   char    *Buffer()     const { return fBuffer; }
92   	   Int_t    BufferSize() const { return fBufSize; }
93   	   void     DetachBuffer() { fBuffer = 0; }
94   	   Int_t    Length()     const { return (Int_t)(fBufCur - fBuffer); }
95   	   void     Expand(Int_t newsize, Bool_t copy = kTRUE);  // expand buffer to newsize
96   	   void     AutoExpand(Int_t size_needed);  // expand buffer to newsize
97   	
98   	   virtual Bool_t     CheckObject(const TObject *obj) = 0;
99   	   virtual Bool_t     CheckObject(const void *obj, const TClass *ptrClass) = 0;
100  	
101  	   virtual Int_t      ReadBuf(void *buf, Int_t max) = 0;
102  	   virtual void       WriteBuf(const void *buf, Int_t max) = 0;
103  	
104  	   virtual char      *ReadString(char *s, Int_t max) = 0;
105  	   virtual void       WriteString(const char *s) = 0;
106  	
107  	   virtual Int_t      GetVersionOwner() const  = 0;
108  	   virtual Int_t      GetMapCount() const  = 0;
109  	   virtual void       GetMappedObject(UInt_t tag, void* &ptr, TClass* &ClassPtr) const = 0;
110  	   virtual void       MapObject(const TObject *obj, UInt_t offset = 1) = 0;
111  	   virtual void       MapObject(const void *obj, const TClass *cl, UInt_t offset = 1) = 0;
112  	   virtual void       Reset() = 0;
113  	   virtual void       InitMap() = 0;
114  	   virtual void       ResetMap() = 0;
115  	   virtual void       SetReadParam(Int_t mapsize) = 0;
116  	   virtual void       SetWriteParam(Int_t mapsize) = 0;
117  	
118  	   virtual Int_t      CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss) = 0;
119  	   virtual Int_t      CheckByteCount(UInt_t startpos, UInt_t bcnt, const char *classname) = 0;
120  	   virtual void       SetByteCount(UInt_t cntpos, Bool_t packInVersion = kFALSE)= 0;
121  	
122  	   virtual void       SkipVersion(const TClass *cl = 0) = 0;
123  	   virtual Version_t  ReadVersion(UInt_t *start = 0, UInt_t *bcnt = 0, const TClass *cl = 0) = 0;
124  	   virtual Version_t  ReadVersionNoCheckSum(UInt_t *start = 0, UInt_t *bcnt = 0) = 0;
125  	   virtual Version_t  ReadVersionForMemberWise(const TClass *cl = 0) = 0;
126  	   virtual UInt_t     WriteVersion(const TClass *cl, Bool_t useBcnt = kFALSE) = 0;
127  	   virtual UInt_t     WriteVersionMemberWise(const TClass *cl, Bool_t useBcnt = kFALSE) = 0;
128  	
129  	   virtual void      *ReadObjectAny(const TClass* cast) = 0;
130  	   virtual void       SkipObjectAny() = 0;
131  	
132  	   virtual void       TagStreamerInfo(TVirtualStreamerInfo* info) = 0;
133  	   virtual void       IncrementLevel(TVirtualStreamerInfo* info) = 0;
134  	   virtual void       SetStreamerElementNumber(TStreamerElement *elem, Int_t comp_type) = 0;
135  	   virtual void       DecrementLevel(TVirtualStreamerInfo*) = 0;
136  	
137  	   virtual void       ClassBegin(const TClass*, Version_t = -1) = 0;
138  	   virtual void       ClassEnd(const TClass*) = 0;
139  	   virtual void       ClassMember(const char*, const char* = 0, Int_t = -1, Int_t = -1) = 0;
140  	   virtual TVirtualStreamerInfo *GetInfo() = 0;
141  	
142  	   virtual TVirtualArray *PeekDataCache() const;
143  	   virtual TVirtualArray *PopDataCache();
144  	   virtual void           PushDataCache(TVirtualArray *);
145  	
146  	   virtual TClass    *ReadClass(const TClass *cl = 0, UInt_t *objTag = 0) = 0;
147  	   virtual void       WriteClass(const TClass *cl) = 0;
148  	
149  	   virtual TObject   *ReadObject(const TClass *cl) = 0;
150  	   virtual void       WriteObject(const TObject *obj) = 0;
151  	
152  	   virtual Int_t      WriteObjectAny(const void *obj, const TClass *ptrClass) = 0;
153  	
154  	   virtual UShort_t   GetPidOffset() const  = 0;
155  	   virtual void       SetPidOffset(UShort_t offset) = 0;
156  	   virtual Int_t      GetBufferDisplacement() const  = 0;
157  	   virtual void       SetBufferDisplacement() = 0;
158  	   virtual void       SetBufferDisplacement(Int_t skipped) = 0;
159  	
160  	   // basic types and arrays of basic types
161  	   virtual   void     ReadFloat16 (Float_t *f, TStreamerElement *ele=0) = 0;
162  	   virtual   void     WriteFloat16(Float_t *f, TStreamerElement *ele=0) = 0;
163  	   virtual   void     ReadDouble32 (Double_t *d, TStreamerElement *ele=0) = 0;
164  	   virtual   void     WriteDouble32(Double_t *d, TStreamerElement *ele=0) = 0;
165  	   virtual   void     ReadWithFactor(Float_t *ptr, Double_t factor, Double_t minvalue) = 0;
166  	   virtual   void     ReadWithNbits(Float_t *ptr, Int_t nbits) = 0;
167  	   virtual   void     ReadWithFactor(Double_t *ptr, Double_t factor, Double_t minvalue) = 0;
168  	   virtual   void     ReadWithNbits(Double_t *ptr, Int_t nbits) = 0;
169  	
170  	   virtual   Int_t    ReadArray(Bool_t    *&b) = 0;
171  	   virtual   Int_t    ReadArray(Char_t    *&c) = 0;
172  	   virtual   Int_t    ReadArray(UChar_t   *&c) = 0;
173  	   virtual   Int_t    ReadArray(Short_t   *&h) = 0;
174  	   virtual   Int_t    ReadArray(UShort_t  *&h) = 0;
175  	   virtual   Int_t    ReadArray(Int_t     *&i) = 0;
176  	   virtual   Int_t    ReadArray(UInt_t    *&i) = 0;
177  	   virtual   Int_t    ReadArray(Long_t    *&l) = 0;
178  	   virtual   Int_t    ReadArray(ULong_t   *&l) = 0;
179  	   virtual   Int_t    ReadArray(Long64_t  *&l) = 0;
180  	   virtual   Int_t    ReadArray(ULong64_t *&l) = 0;
181  	   virtual   Int_t    ReadArray(Float_t   *&f) = 0;
182  	   virtual   Int_t    ReadArray(Double_t  *&d) = 0;
183  	   virtual   Int_t    ReadArrayFloat16(Float_t *&f, TStreamerElement *ele=0) = 0;
184  	   virtual   Int_t    ReadArrayDouble32(Double_t *&d, TStreamerElement *ele=0) = 0;
185  	
186  	   virtual   Int_t    ReadStaticArray(Bool_t    *b) = 0;
187  	   virtual   Int_t    ReadStaticArray(Char_t    *c) = 0;
188  	   virtual   Int_t    ReadStaticArray(UChar_t   *c) = 0;
189  	   virtual   Int_t    ReadStaticArray(Short_t   *h) = 0;
190  	   virtual   Int_t    ReadStaticArray(UShort_t  *h) = 0;
191  	   virtual   Int_t    ReadStaticArray(Int_t     *i) = 0;
192  	   virtual   Int_t    ReadStaticArray(UInt_t    *i) = 0;
193  	   virtual   Int_t    ReadStaticArray(Long_t    *l) = 0;
194  	   virtual   Int_t    ReadStaticArray(ULong_t   *l) = 0;
195  	   virtual   Int_t    ReadStaticArray(Long64_t  *l) = 0;
196  	   virtual   Int_t    ReadStaticArray(ULong64_t *l) = 0;
197  	   virtual   Int_t    ReadStaticArray(Float_t   *f) = 0;
198  	   virtual   Int_t    ReadStaticArray(Double_t  *d) = 0;
199  	   virtual   Int_t    ReadStaticArrayFloat16(Float_t  *f, TStreamerElement *ele=0) = 0;
200  	   virtual   Int_t    ReadStaticArrayDouble32(Double_t  *d, TStreamerElement *ele=0) = 0;
201  	
202  	   virtual   void     ReadFastArray(Bool_t    *b, Int_t n) = 0;
203  	   virtual   void     ReadFastArray(Char_t    *c, Int_t n) = 0;
204  	   virtual   void     ReadFastArrayString(Char_t *c, Int_t n) = 0;
205  	   virtual   void     ReadFastArray(UChar_t   *c, Int_t n) = 0;
206  	   virtual   void     ReadFastArray(Short_t   *h, Int_t n) = 0;
207  	   virtual   void     ReadFastArray(UShort_t  *h, Int_t n) = 0;
208  	   virtual   void     ReadFastArray(Int_t     *i, Int_t n) = 0;
209  	   virtual   void     ReadFastArray(UInt_t    *i, Int_t n) = 0;
210  	   virtual   void     ReadFastArray(Long_t    *l, Int_t n) = 0;
211  	   virtual   void     ReadFastArray(ULong_t   *l, Int_t n) = 0;
212  	   virtual   void     ReadFastArray(Long64_t  *l, Int_t n) = 0;
213  	   virtual   void     ReadFastArray(ULong64_t *l, Int_t n) = 0;
214  	   virtual   void     ReadFastArray(Float_t   *f, Int_t n) = 0;
215  	   virtual   void     ReadFastArray(Double_t  *d, Int_t n) = 0;
216  	   virtual   void     ReadFastArrayFloat16(Float_t  *f, Int_t n, TStreamerElement *ele=0) = 0;
217  	   virtual   void     ReadFastArrayDouble32(Double_t  *d, Int_t n, TStreamerElement *ele=0) = 0;
218  	   virtual   void     ReadFastArrayWithFactor(Float_t *ptr, Int_t n, Double_t factor, Double_t minvalue) = 0;
219  	   virtual   void     ReadFastArrayWithNbits(Float_t *ptr, Int_t n, Int_t nbits) = 0;
220  	   virtual   void     ReadFastArrayWithFactor(Double_t *ptr, Int_t n, Double_t factor, Double_t minvalue) = 0;
221  	   virtual   void     ReadFastArrayWithNbits(Double_t *ptr, Int_t n, Int_t nbits) = 0;
222  	   virtual   void     ReadFastArray(void  *start , const TClass *cl, Int_t n=1, TMemberStreamer *s=0, const TClass *onFileClass=0) = 0;
223  	   virtual   void     ReadFastArray(void **startp, const TClass *cl, Int_t n=1, Bool_t isPreAlloc=kFALSE, TMemberStreamer *s=0, const TClass *onFileClass=0) = 0;
224  	
225  	   virtual   void     WriteArray(const Bool_t    *b, Int_t n) = 0;
226  	   virtual   void     WriteArray(const Char_t    *c, Int_t n) = 0;
227  	   virtual   void     WriteArray(const UChar_t   *c, Int_t n) = 0;
228  	   virtual   void     WriteArray(const Short_t   *h, Int_t n) = 0;
229  	   virtual   void     WriteArray(const UShort_t  *h, Int_t n) = 0;
230  	   virtual   void     WriteArray(const Int_t     *i, Int_t n) = 0;
231  	   virtual   void     WriteArray(const UInt_t    *i, Int_t n) = 0;
232  	   virtual   void     WriteArray(const Long_t    *l, Int_t n) = 0;
233  	   virtual   void     WriteArray(const ULong_t   *l, Int_t n) = 0;
234  	   virtual   void     WriteArray(const Long64_t  *l, Int_t n) = 0;
235  	   virtual   void     WriteArray(const ULong64_t *l, Int_t n) = 0;
236  	   virtual   void     WriteArray(const Float_t   *f, Int_t n) = 0;
237  	   virtual   void     WriteArray(const Double_t  *d, Int_t n) = 0;
238  	   virtual   void     WriteArrayFloat16(const Float_t  *f, Int_t n, TStreamerElement *ele=0) = 0;
239  	   virtual   void     WriteArrayDouble32(const Double_t  *d, Int_t n, TStreamerElement *ele=0) = 0;
240  	
241  	   virtual   void     WriteFastArray(const Bool_t    *b, Int_t n) = 0;
242  	   virtual   void     WriteFastArray(const Char_t    *c, Int_t n) = 0;
243  	   virtual   void     WriteFastArrayString(const Char_t    *c, Int_t n) = 0;
244  	   virtual   void     WriteFastArray(const UChar_t   *c, Int_t n) = 0;
245  	   virtual   void     WriteFastArray(const Short_t   *h, Int_t n) = 0;
246  	   virtual   void     WriteFastArray(const UShort_t  *h, Int_t n) = 0;
247  	   virtual   void     WriteFastArray(const Int_t     *i, Int_t n) = 0;
248  	   virtual   void     WriteFastArray(const UInt_t    *i, Int_t n) = 0;
249  	   virtual   void     WriteFastArray(const Long_t    *l, Int_t n) = 0;
250  	   virtual   void     WriteFastArray(const ULong_t   *l, Int_t n) = 0;
251  	   virtual   void     WriteFastArray(const Long64_t  *l, Int_t n) = 0;
252  	   virtual   void     WriteFastArray(const ULong64_t *l, Int_t n) = 0;
253  	   virtual   void     WriteFastArray(const Float_t   *f, Int_t n) = 0;
254  	   virtual   void     WriteFastArray(const Double_t  *d, Int_t n) = 0;
255  	   virtual   void     WriteFastArrayFloat16(const Float_t  *f, Int_t n, TStreamerElement *ele=0) = 0;
256  	   virtual   void     WriteFastArrayDouble32(const Double_t  *d, Int_t n, TStreamerElement *ele=0) = 0;
257  	   virtual   void     WriteFastArray(void  *start,  const TClass *cl, Int_t n=1, TMemberStreamer *s=0) = 0;
258  	   virtual   Int_t    WriteFastArray(void **startp, const TClass *cl, Int_t n=1, Bool_t isPreAlloc=kFALSE, TMemberStreamer *s=0) = 0;
259  	
260  	   virtual   void     StreamObject(void *obj, const type_info &typeinfo, const TClass* onFileClass = 0 ) = 0;
261  	   virtual   void     StreamObject(void *obj, const char *className, const TClass* onFileClass = 0 ) = 0;
262  	   virtual   void     StreamObject(void *obj, const TClass *cl, const TClass* onFileClass = 0 ) = 0;
263  	   virtual   void     StreamObject(TObject *obj) = 0;
264  	
265  	   virtual   void     ReadBool(Bool_t       &b) = 0;
266  	   virtual   void     ReadChar(Char_t       &c) = 0;
267  	   virtual   void     ReadUChar(UChar_t     &c) = 0;
268  	   virtual   void     ReadShort(Short_t     &s) = 0;
269  	   virtual   void     ReadUShort(UShort_t   &s) = 0;
270  	   virtual   void     ReadInt(Int_t         &i) = 0;
271  	   virtual   void     ReadUInt(UInt_t       &i) = 0;
272  	   virtual   void     ReadLong(Long_t       &l) = 0;
273  	   virtual   void     ReadULong(ULong_t     &l) = 0;
274  	   virtual   void     ReadLong64(Long64_t   &l) = 0;
275  	   virtual   void     ReadULong64(ULong64_t &l) = 0;
276  	   virtual   void     ReadFloat(Float_t     &f) = 0;
277  	   virtual   void     ReadDouble(Double_t   &d) = 0;
278  	   virtual   void     ReadCharP(Char_t      *c) = 0;
279  	   virtual   void     ReadTString(TString   &s) = 0;
280  	   virtual   void     ReadStdString(std::string &s) = 0;
281  	
282  	   virtual   void     WriteBool(Bool_t       b) = 0;
283  	   virtual   void     WriteChar(Char_t       c) = 0;
284  	   virtual   void     WriteUChar(UChar_t     c) = 0;
285  	   virtual   void     WriteShort(Short_t     s) = 0;
286  	   virtual   void     WriteUShort(UShort_t   s) = 0;
287  	   virtual   void     WriteInt(Int_t         i) = 0;
288  	   virtual   void     WriteUInt(UInt_t       i) = 0;
289  	   virtual   void     WriteLong(Long_t       l) = 0;
290  	   virtual   void     WriteULong(ULong_t     l) = 0;
291  	   virtual   void     WriteLong64(Long64_t   l) = 0;
292  	   virtual   void     WriteULong64(ULong64_t l) = 0;
293  	   virtual   void     WriteFloat(Float_t     f) = 0;
294  	   virtual   void     WriteDouble(Double_t   d) = 0;
295  	   virtual   void     WriteCharP(const Char_t *c) = 0;
296  	   virtual   void     WriteTString(const TString &s) = 0;
297  	   virtual   void     WriteStdString(const std::string &s) = 0;
298  	
299  	   // Special basic ROOT objects and collections
300  	   virtual   TProcessID *GetLastProcessID(TRefTable *reftable) const = 0;
301  	   virtual   UInt_t      GetTRefExecId() = 0;
302  	   virtual   TProcessID *ReadProcessID(UShort_t pidf) = 0;
303  	   virtual   UShort_t    WriteProcessID(TProcessID *pid) = 0;
304  	
305  	   // Utilities for TStreamerInfo
306  	   virtual   void     ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t force) = 0;
307  	   virtual   void     ForceWriteInfoClones(TClonesArray *a) = 0;
308  	   virtual   Int_t    ReadClones (TClonesArray *a, Int_t nobjects, Version_t objvers) = 0;
309  	   virtual   Int_t    WriteClones(TClonesArray *a, Int_t nobjects) = 0;
310  	
311  	   // Utilities for TClass
312  	   virtual   Int_t    ReadClassEmulated(const TClass *cl, void *object, const TClass *onfile_class = 0) = 0;
313  	   virtual   Int_t    ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class = 0) = 0;
314  	   virtual   Int_t    ReadClassBuffer(const TClass *cl, void *pointer, Int_t version, UInt_t start, UInt_t count, const TClass *onfile_class = 0) = 0;
315  	   virtual   Int_t    WriteClassBuffer(const TClass *cl, void *pointer) = 0;
316  	
317  	   // Utilites to streamer using sequences.
318  	   virtual Int_t ApplySequence(const TStreamerInfoActions::TActionSequence &sequence, void *object) = 0;
319  	   virtual Int_t ApplySequenceVecPtr(const TStreamerInfoActions::TActionSequence &sequence, void *start_collection, void *end_collection) = 0;
320  	   virtual Int_t ApplySequence(const TStreamerInfoActions::TActionSequence &sequence, void *start_collection, void *end_collection) = 0;
321  	
322  	   static TClass *GetClass(const type_info &typeinfo);
323  	   static TClass *GetClass(const char *className);
324  	
325  	   ClassDef(TBuffer,0)  //Buffer base class used for serializing objects
326  	};
327  	
328  	//---------------------- TBuffer default external operators --------------------
329  	
330  	inline TBuffer &operator>>(TBuffer &buf, Bool_t &b)   { buf.ReadBool(b);   return buf; }
331  	inline TBuffer &operator>>(TBuffer &buf, Char_t &c)   { buf.ReadChar(c);   return buf; }
332  	inline TBuffer &operator>>(TBuffer &buf, UChar_t &c)  { buf.ReadUChar(c);  return buf; }
333  	inline TBuffer &operator>>(TBuffer &buf, Short_t &s)  { buf.ReadShort(s);  return buf; }
334  	inline TBuffer &operator>>(TBuffer &buf, UShort_t &s) { buf.ReadUShort(s); return buf; }
335  	inline TBuffer &operator>>(TBuffer &buf, Int_t &i)    { buf.ReadInt(i);    return buf; }
336  	inline TBuffer &operator>>(TBuffer &buf, UInt_t &i)   { buf.ReadUInt(i);   return buf; }
337  	inline TBuffer &operator>>(TBuffer &buf, Long_t &l)   { buf.ReadLong(l);   return buf; }
338  	inline TBuffer &operator>>(TBuffer &buf, ULong_t &l)  { buf.ReadULong(l);  return buf; }
339  	inline TBuffer &operator>>(TBuffer &buf, Long64_t &l) { buf.ReadLong64(l); return buf; }
340  	inline TBuffer &operator>>(TBuffer &buf, ULong64_t &l){ buf.ReadULong64(l);return buf; }
341  	inline TBuffer &operator>>(TBuffer &buf, Float_t &f)  { buf.ReadFloat(f);  return buf; }
342  	inline TBuffer &operator>>(TBuffer &buf, Double_t &d) { buf.ReadDouble(d); return buf; }
343  	inline TBuffer &operator>>(TBuffer &buf, Char_t *c)   { buf.ReadCharP(c);  return buf; }
344  	inline TBuffer &operator>>(TBuffer &buf, TString &s)  { buf.ReadTString(s);return buf; }
345  	
346  	inline TBuffer &operator<<(TBuffer &buf, Bool_t b)   { buf.WriteBool(b);   return buf; }
347  	inline TBuffer &operator<<(TBuffer &buf, Char_t c)   { buf.WriteChar(c);   return buf; }
348  	inline TBuffer &operator<<(TBuffer &buf, UChar_t c)  { buf.WriteUChar(c);  return buf; }
349  	inline TBuffer &operator<<(TBuffer &buf, Short_t s)  { buf.WriteShort(s);  return buf; }
350  	inline TBuffer &operator<<(TBuffer &buf, UShort_t s) { buf.WriteUShort(s); return buf; }
351  	inline TBuffer &operator<<(TBuffer &buf, Int_t i)    { buf.WriteInt(i);    return buf; }
352  	inline TBuffer &operator<<(TBuffer &buf, UInt_t i)   { buf.WriteUInt(i);   return buf; }
353  	inline TBuffer &operator<<(TBuffer &buf, Long_t l)   { buf.WriteLong(l);   return buf; }
354  	inline TBuffer &operator<<(TBuffer &buf, ULong_t l)  { buf.WriteULong(l);  return buf; }
355  	inline TBuffer &operator<<(TBuffer &buf, Long64_t l) { buf.WriteLong64(l); return buf; }
356  	inline TBuffer &operator<<(TBuffer &buf, ULong64_t l){ buf.WriteULong64(l);return buf; }
357  	inline TBuffer &operator<<(TBuffer &buf, Float_t f)  { buf.WriteFloat(f);  return buf; }
358  	inline TBuffer &operator<<(TBuffer &buf, Double_t d) { buf.WriteDouble(d); return buf; }
359  	inline TBuffer &operator<<(TBuffer &buf, const Char_t *c)  { buf.WriteCharP(c);  return buf; }
360  	inline TBuffer &operator<<(TBuffer &buf, const TString &s) { buf.WriteTString(s);return buf; }
361  	
362  	#if !defined(R__CONCRETE_INPUT_OPERATOR)
363  	#ifndef __CINT__
364  	
365  	#if defined(R__SOLARIS) && defined(R__GNU)
366  	#include <typeinfo>
367  	#endif
368  	
369  	template <class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj)
370  	{
371  	   // Read TObject derived classes from a TBuffer. Need to provide
372  	   // custom version for non-TObject derived classes.
373  	
374  	   // This operator has to be a templated and/or automatically
375  	   // generated if we want to be able to check the type of the
376  	   // incoming object. I.e. a operator>>(TBuffer &buf, TObject *&)
377  	   // would not be sufficient to pass the information 'which class do we want'
378  	   // since the pointer could be zero (so typeid(*obj) is not usable).
379  	
380  	   TClass *cl = TBuffer::GetClass(typeid(Tmpl));
381  	   obj = (Tmpl *) ( (void*) buf.ReadObjectAny(cl) );
382  	   return buf;
383  	}
384  	
385  	template <class Tmpl> TBuffer &operator<<(TBuffer &buf, const Tmpl *obj)
386  	{
387  	   TClass *cl = (obj) ? TBuffer::GetClass(typeid(*obj)) : 0;
388  	   buf.WriteObjectAny(obj, cl);
389  	   return buf;
390  	}
391  	#else
392  	template <class Tmpl> TBuffer &operator>>(TBuffer &buf, Tmpl *&obj);
393  	template <class Tmpl> TBuffer &operator<<(TBuffer &buf, Tmpl *&obj);
394  	#endif
395  	#endif
396  	
397  	#if defined(R__TEMPLATE_OVERLOAD_BUG)
398  	template <>
399  	#endif
400  	inline TBuffer &operator<<(TBuffer &buf, const TObject *obj)
401  	   { buf.WriteObjectAny(obj, TObject::Class()); return buf; }
402  	
403  	#endif
404