12 #ifndef ROOT_TStreamerInfo
13 #define ROOT_TStreamerInfo
33 class TMemberStreamer;
34 class TStreamerElement;
35 class TStreamerBasicType;
38 namespace ROOT {
namespace Detail {
class TCollectionProxyInfo; } }
39 namespace ROOT {
class TSchemaRule; }
41 namespace TStreamerInfoActions {
class TActionSequence; }
43 class TStreamerInfo :
public TVirtualStreamerInfo {
55 TStreamerElement *fElem;
60 TMemberStreamer *fStreamer;
61 TCompInfo() : fType(-1), fNewType(0), fOffset(0), fLength(0), fElem(0), fMethod(0),
62 fClass(0), fNewClass(0), fClassName(), fStreamer(0) {};
64 void Update(
const TClass *oldcl, TClass *newcl);
66 friend class TStreamerInfoActions::TActionSequence;
70 typedef TCompInfo TCompInfo_t;
76 class TPointerCollectionAdapter
79 TPointerCollectionAdapter( TVirtualCollectionProxy *proxy ):
82 char* operator[]( UInt_t idx )
const
84 char **el = (
char**)fProxy->At(idx);
88 TVirtualCollectionProxy *fProxy;
94 Int_t fOnFileClassVersion;
101 TCompInfo **fCompOpt;
102 TCompInfo **fCompFull;
104 TObjArray *fElements;
105 Version_t fOldVersion;
106 Int_t fNVirtualInfoLoc;
107 ULong_t *fVirtualInfoLoc;
108 std::atomic<ULong_t> fLiveCount;
109 TStreamerInfoActions::TActionSequence *fReadObjectWise;
110 TStreamerInfoActions::TActionSequence *fReadMemberWise;
111 TStreamerInfoActions::TActionSequence *fReadMemberWiseVecPtr;
112 TStreamerInfoActions::TActionSequence *fReadText;
113 TStreamerInfoActions::TActionSequence *fWriteObjectWise;
114 TStreamerInfoActions::TActionSequence *fWriteMemberWise;
115 TStreamerInfoActions::TActionSequence *fWriteMemberWiseVecPtr;
116 TStreamerInfoActions::TActionSequence *fWriteText;
118 static std::atomic<Int_t> fgCount;
120 template <
typename T>
static T GetTypedValueAux(Int_t type,
void *ladd,
int k, Int_t len);
121 static void PrintValueAux(
char *ladd, Int_t atype, TStreamerElement * aElement, Int_t aleng, Int_t *count);
123 UInt_t GenerateIncludes(FILE *fp,
char *inclist,
const TList *extrainfos);
124 void GenerateDeclaration(FILE *fp, FILE *sfp,
const TList *subClasses, Bool_t top = kTRUE);
125 void InsertArtificialElements(std::vector<const ROOT::TSchemaRule*> &rules);
126 void DestructorImpl(
void* p, Bool_t dtorOnly);
129 TStreamerInfo(
const TStreamerInfo&) =
delete;
130 TStreamerInfo& operator=(
const TStreamerInfo&) =
delete;
131 void AddReadAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
132 void AddWriteAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
133 void AddReadTextAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
134 void AddWriteTextAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
135 void AddReadMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
136 void AddWriteMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
166 kBase = 0, kOffsetL = 20, kOffsetP = 40, kCounter = 6, kCharStar = 7,
167 kChar = 1, kShort = 2, kInt = 3, kLong = 4, kFloat = 5,
168 kDouble = 8, kDouble32= 9,
170 kUChar = 11, kUShort = 12, kUInt = 13, kULong = 14, kBits = 15,
171 kLong64 = 16, kULong64 = 17, kBool = 18, kFloat16 = 19,
172 kObject = 61, kAny = 62, kObjectp = 63, kObjectP = 64, kTString = 65,
173 kTObject = 66, kTNamed = 67, kAnyp = 68, kAnyP = 69, kAnyPnoVT = 70,
175 kSkip = 100, kSkipL = 120, kSkipP = 140,
176 kConv = 200, kConvL = 220, kConvP = 240,
177 kSTL = 300, kSTLstring = 365,
178 kStreamer = 500, kStreamLoop = 501,
183 kNeedObjectForVirtualBaseClass = 99997,
188 TStreamerInfo(TClass *cl);
189 virtual ~TStreamerInfo();
191 void BuildCheck(TFile *file = 0);
192 void BuildEmulated(TFile *file);
194 virtual Bool_t BuildFor(
const TClass *cl );
195 void CallShowMembers(
const void* obj, TMemberInspector &insp, Bool_t isTransient)
const;
196 void Clear(Option_t *);
197 TObject *Clone(
const char *newname =
"")
const;
198 Bool_t CompareContent(TClass *cl,TVirtualStreamerInfo *info, Bool_t warn, Bool_t complete, TFile *file);
201 void ForceWriteInfo(TFile *file, Bool_t force=kFALSE);
202 Int_t GenerateHeaderFile(
const char *dirname,
const TList *subClasses = 0,
const TList *extrainfos = 0);
203 TClass *GetActualClass(
const void *obj)
const;
204 TClass *GetClass()
const {
return fClass;}
205 UInt_t GetCheckSum()
const {
return fCheckSum;}
206 UInt_t GetCheckSum(TClass::ECheckSum code)
const;
207 Int_t GetClassVersion()
const {
return fClassVersion;}
208 Int_t GetDataMemberOffset(TDataMember *dm, TMemberStreamer *&streamer)
const;
209 TObjArray *GetElements()
const {
return fElements;}
210 TStreamerElement *GetElem(Int_t
id)
const {
return fComp[id].fElem;}
211 TStreamerElement *GetElement(Int_t
id)
const {
return (TStreamerElement*)fElements->At(
id);}
212 Int_t GetElementOffset(Int_t
id)
const {
return fCompFull[id]->fOffset;}
213 TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Bool_t forCollection) {
return forCollection ? fReadMemberWiseVecPtr : fReadMemberWise; }
214 TStreamerInfoActions::TActionSequence *GetReadObjectWiseActions() {
return fReadObjectWise; }
215 TStreamerInfoActions::TActionSequence *GetReadTextActions() {
return fReadText; }
216 TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions(Bool_t forCollection) {
return forCollection ? fWriteMemberWiseVecPtr : fWriteMemberWise; }
217 TStreamerInfoActions::TActionSequence *GetWriteObjectWiseActions() {
return fWriteObjectWise; }
218 TStreamerInfoActions::TActionSequence *GetWriteTextActions() {
return fWriteText; }
219 Int_t GetNdata()
const {
return fNdata;}
220 Int_t GetNelement()
const {
return fElements->GetEntries(); }
221 Int_t GetNumber()
const {
return fNumber;}
222 Int_t GetLength(Int_t
id)
const {
return fComp[id].fLength;}
223 ULong_t GetMethod(Int_t
id)
const {
return fComp[id].fMethod;}
224 Int_t GetNewType(Int_t
id)
const {
return fComp[id].fNewType;}
225 Int_t GetOffset(
const char *)
const;
226 Int_t GetOffset(Int_t
id)
const {
return fComp[id].fOffset;}
227 Version_t GetOldVersion()
const {
return fOldVersion;}
228 Int_t GetOnFileClassVersion()
const {
return fOnFileClassVersion;}
229 Int_t GetSize()
const;
230 Int_t GetSizeElements()
const;
231 TStreamerElement *GetStreamerElement(
const char*datamember, Int_t& offset)
const;
232 TStreamerElement *GetStreamerElementReal(Int_t i, Int_t j)
const;
233 Int_t GetType(Int_t
id)
const {
return fComp[id].fType;}
234 template <
typename T> T GetTypedValue(
char *pointer, Int_t i, Int_t j, Int_t len)
const;
235 template <
typename T> T GetTypedValueClones(TClonesArray *clones, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const;
236 template <
typename T> T GetTypedValueSTL(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const;
237 template <
typename T> T GetTypedValueSTLP(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const;
238 Double_t GetValue(
char *pointer, Int_t i, Int_t j, Int_t len)
const {
return GetTypedValue<Double_t>(pointer, i, j, len); }
239 Double_t GetValueClones(TClonesArray *clones, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const {
return GetTypedValueClones<Double_t>(clones, i, j, k, eoffset); }
240 Double_t GetValueSTL(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const {
return GetTypedValueSTL<Double_t>(cont, i, j, k, eoffset); }
241 Double_t GetValueSTLP(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset)
const {
return GetTypedValueSTLP<Double_t>(cont, i, j, k, eoffset); }
242 void ls(Option_t *option=
"")
const;
243 Bool_t MatchLegacyCheckSum(UInt_t checksum)
const;
244 TVirtualStreamerInfo *NewInfo(TClass *cl) {
return new TStreamerInfo(cl);}
245 void *New(
void *obj = 0);
246 void *NewArray(Long_t nElements,
void* ary = 0);
247 void Destructor(
void* p, Bool_t dtorOnly = kFALSE);
248 void DeleteArray(
void* p, Bool_t dtorOnly = kFALSE);
249 void PrintValue(
const char *name,
char *pointer, Int_t i, Int_t len, Int_t lenmax=1000)
const;
250 void PrintValueClones(
const char *name, TClonesArray *clones, Int_t i, Int_t eoffset, Int_t lenmax=1000)
const;
251 void PrintValueSTL(
const char *name, TVirtualCollectionProxy *cont, Int_t i, Int_t eoffset, Int_t lenmax=1000)
const;
254 Int_t ReadBuffer(TBuffer &b,
const T &arrptr, TCompInfo *
const*
const compinfo, Int_t first, Int_t last, Int_t narr=1,Int_t eoffset=0,Int_t mode=0);
256 Int_t ReadBufferSkip(TBuffer &b,
const T &arrptr,
const TCompInfo *compinfo,Int_t kase, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
258 Int_t ReadBufferConv(TBuffer &b,
const T &arrptr,
const TCompInfo *compinfo,Int_t kase, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
260 Int_t ReadBufferArtificial(TBuffer &b,
const T &arrptr, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
262 Int_t ReadBufferClones(TBuffer &b, TClonesArray *clones, Int_t nc, Int_t first, Int_t eoffset);
263 Int_t ReadBufferSTL(TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc, Int_t eoffset, Bool_t v7 = kTRUE );
264 void SetCheckSum(UInt_t checksum) {fCheckSum = checksum;}
265 void SetClass(TClass *cl) {fClass = cl;}
266 void SetClassVersion(Int_t vers) {fClassVersion=vers;}
267 void SetOnFileClassVersion(Int_t vers) {fOnFileClassVersion=vers;}
268 void TagFile(TFile *fFile);
271 Int_t WriteBuffer(TBuffer &b,
char *pointer, Int_t first);
272 Int_t WriteBufferClones(TBuffer &b, TClonesArray *clones, Int_t nc, Int_t first, Int_t eoffset);
273 Int_t WriteBufferSTL (TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc);
274 Int_t WriteBufferSTLPtrs( TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc, Int_t first, Int_t eoffset);
276 virtual void Update(
const TClass *oldClass, TClass *newClass);
278 virtual TVirtualCollectionProxy *GenEmulatedProxy(
const char* class_name, Bool_t silent);
279 virtual TClassStreamer *GenEmulatedClassStreamer(
const char* class_name, Bool_t silent);
280 virtual TVirtualCollectionProxy *GenExplicitProxy( const ::ROOT::Detail::TCollectionProxyInfo &info, TClass *cl );
281 virtual TClassStreamer *GenExplicitClassStreamer( const ::ROOT::Detail::TCollectionProxyInfo &info, TClass *cl );
283 static TStreamerElement *GetCurrentElement();
288 Int_t WriteBufferAux (TBuffer &b,
const T &arr, TCompInfo *
const*
const compinfo, Int_t first, Int_t last, Int_t narr,Int_t eoffset,Int_t mode);
291 ClassDef(TStreamerInfo,9)