File indexing completed on 2025-09-17 09:16:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_TStreamerInfo
0013 #define ROOT_TStreamerInfo
0014
0015 #include <atomic>
0016 #include <vector>
0017
0018 #include "TVirtualStreamerInfo.h"
0019
0020 #include "TVirtualCollectionProxy.h"
0021
0022 #include "TObjArray.h"
0023
0024
0025 class TFile;
0026 class TClass;
0027 class TClonesArray;
0028 class TDataMember;
0029 class TMemberStreamer;
0030 class TStreamerElement;
0031 class TStreamerBasicType;
0032 class TClassStreamer;
0033 class TVirtualArray;
0034 namespace ROOT { namespace Detail { class TCollectionProxyInfo; } }
0035 namespace ROOT { class TSchemaRule; }
0036
0037 namespace TStreamerInfoActions { class TActionSequence; }
0038
0039 class TStreamerInfo : public TVirtualStreamerInfo {
0040
0041 class TCompInfo {
0042
0043 private:
0044
0045
0046 public:
0047 Int_t fType;
0048 Int_t fNewType;
0049 Int_t fOffset;
0050 Int_t fLength;
0051 TStreamerElement *fElem;
0052 ULongptr_t fMethod;
0053 TClass *fClass;
0054 TClass *fNewClass;
0055 TString fClassName;
0056 TMemberStreamer *fStreamer;
0057 TCompInfo() : fType(-1), fNewType(0), fOffset(0), fLength(0), fElem(nullptr), fMethod(0),
0058 fClass(nullptr), fNewClass(nullptr), fClassName(), fStreamer(nullptr) {}
0059 ~TCompInfo() {}
0060 void Update(const TClass *oldcl, TClass *newcl);
0061 };
0062 friend class TStreamerInfoActions::TActionSequence;
0063
0064 public:
0065
0066 typedef TCompInfo TCompInfo_t;
0067
0068 protected:
0069
0070
0071
0072 class TPointerCollectionAdapter
0073 {
0074 public:
0075 TPointerCollectionAdapter( TVirtualCollectionProxy *proxy ):
0076 fProxy( proxy ) {}
0077
0078 char* operator[]( UInt_t idx ) const
0079 {
0080 char **el = (char**)fProxy->At(idx);
0081 return *el;
0082 }
0083 private:
0084 TVirtualCollectionProxy *fProxy;
0085 };
0086
0087 private:
0088 UInt_t fCheckSum;
0089 Int_t fClassVersion;
0090 Int_t fOnFileClassVersion;
0091 Int_t fNumber;
0092 Int_t fSize;
0093 Int_t fNdata;
0094 Int_t fNfulldata;
0095 Int_t fNslots;
0096 TCompInfo *fComp;
0097 TCompInfo **fCompOpt;
0098 TCompInfo **fCompFull;
0099 TClass *fClass;
0100 TObjArray *fElements;
0101 Version_t fOldVersion;
0102 Int_t fNVirtualInfoLoc;
0103 ULong_t *fVirtualInfoLoc;
0104 TStreamerInfoActions::TActionSequence *fReadObjectWise;
0105 TStreamerInfoActions::TActionSequence *fReadMemberWise;
0106 TStreamerInfoActions::TActionSequence *fReadMemberWiseVecPtr;
0107 TStreamerInfoActions::TActionSequence *fReadText;
0108 TStreamerInfoActions::TActionSequence *fWriteObjectWise;
0109 TStreamerInfoActions::TActionSequence *fWriteMemberWise;
0110 TStreamerInfoActions::TActionSequence *fWriteMemberWiseVecPtr;
0111 TStreamerInfoActions::TActionSequence *fWriteText;
0112
0113 static std::atomic<Int_t> fgCount;
0114
0115 template <typename T> static T GetTypedValueAux(Int_t type, void *ladd, int k, Int_t len);
0116 static void PrintValueAux(char *ladd, Int_t atype, TStreamerElement * aElement, Int_t aleng, Int_t *count);
0117
0118 UInt_t GenerateIncludes(FILE *fp, char *inclist, const TList *extrainfos);
0119 void GenerateDeclaration(FILE *fp, FILE *sfp, const TList *subClasses, Bool_t top = kTRUE);
0120 void InsertArtificialElements(std::vector<const ROOT::TSchemaRule*> &rules);
0121 void DestructorImpl(void* p, Bool_t dtorOnly);
0122
0123 private:
0124 TStreamerInfo(const TStreamerInfo&) = delete;
0125 TStreamerInfo& operator=(const TStreamerInfo&) = delete;
0126 void AddReadAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
0127 void AddWriteAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
0128 void AddReadTextAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
0129 void AddWriteTextAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
0130 void AddReadMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t index, TCompInfo *compinfo);
0131 void AddWriteMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t index, TCompInfo *compinfo);
0132
0133 public:
0134
0135
0136
0137
0138
0139
0140
0141 TStreamerInfo();
0142 TStreamerInfo(TClass *cl);
0143 ~TStreamerInfo() override;
0144 void Build(Bool_t isTransient = kFALSE) override;
0145 void BuildCheck(TFile *file = nullptr, Bool_t load = kTRUE) override;
0146 void BuildEmulated(TFile *file) override;
0147 void BuildOld() override;
0148 Bool_t BuildFor( const TClass *cl ) override;
0149 void CallShowMembers(const void* obj, TMemberInspector &insp, Bool_t isTransient) const override;
0150 void Clear(Option_t * = "") override;
0151 TObject *Clone(const char *newname = "") const override;
0152 Bool_t CompareContent(TClass *cl,TVirtualStreamerInfo *info, Bool_t warn, Bool_t complete, TFile *file) override;
0153 void Compile() override;
0154 void ComputeSize();
0155 void ForceWriteInfo(TFile *file, Bool_t force = kFALSE) override;
0156 Int_t GenerateHeaderFile(const char *dirname, const TList *subClasses = nullptr, const TList *extrainfos = nullptr) override;
0157 TClass *GetActualClass(const void *obj) const override;
0158 TClass *GetClass() const override { return fClass; }
0159 UInt_t GetCheckSum() const override { return fCheckSum; }
0160 UInt_t GetCheckSum(TClass::ECheckSum code) const;
0161 Int_t GetClassVersion() const override { return fClassVersion; }
0162 Int_t GetDataMemberOffset(TDataMember *dm, TMemberStreamer *&streamer) const;
0163 TObjArray *GetElements() const override {return fElements;}
0164 TStreamerElement *GetElem(Int_t id) const override { return fComp[id].fElem; }
0165 TStreamerElement *GetElement(Int_t id) const override {return (TStreamerElement*)fElements->At(id);}
0166 Int_t GetElementOffset(Int_t id) const override {return fCompFull[id]->fOffset;}
0167 TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Bool_t forCollection) { return forCollection ? fReadMemberWiseVecPtr : fReadMemberWise; }
0168 TStreamerInfoActions::TActionSequence *GetReadObjectWiseActions() { return fReadObjectWise; }
0169 TStreamerInfoActions::TActionSequence *GetReadTextActions() { return fReadText; }
0170 TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions(Bool_t forCollection) { return forCollection ? fWriteMemberWiseVecPtr : fWriteMemberWise; }
0171 TStreamerInfoActions::TActionSequence *GetWriteObjectWiseActions() { return fWriteObjectWise; }
0172 TStreamerInfoActions::TActionSequence *GetWriteTextActions() { return fWriteText; }
0173 Int_t GetNdata() const {return fNdata;}
0174 Int_t GetNelement() const { return fElements->GetEntriesFast(); }
0175 Int_t GetNumber() const override { return fNumber; }
0176 Int_t GetLength(Int_t id) const {return fComp[id].fLength;}
0177 ULongptr_t GetMethod(Int_t id) const {return fComp[id].fMethod;}
0178 Int_t GetNewType(Int_t id) const {return fComp[id].fNewType;}
0179 Int_t GetOffset(const char *) const override;
0180 Int_t GetOffset(Int_t id) const override {return fComp[id].fOffset;}
0181 Version_t GetOldVersion() const override {return fOldVersion;}
0182 Int_t GetOnFileClassVersion() const override {return fOnFileClassVersion;}
0183 Int_t GetSize() const override;
0184 Int_t GetSizeElements() const;
0185 TStreamerElement *GetStreamerElement(const char*datamember, Int_t& offset) const override;
0186 TStreamerElement *GetStreamerElementReal(Int_t i, Int_t j) const;
0187 Int_t GetType(Int_t id) const {return fComp[id].fType;}
0188 template <typename T> T GetTypedValue(char *pointer, Int_t i, Int_t j, Int_t len) const;
0189 template <typename T> T GetTypedValueClones(TClonesArray *clones, Int_t i, Int_t j, Int_t k, Int_t eoffset) const;
0190 template <typename T> T GetTypedValueSTL(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset) const;
0191 template <typename T> T GetTypedValueSTLP(TVirtualCollectionProxy *cont, Int_t i, Int_t j, Int_t k, Int_t eoffset) const;
0192 Double_t GetValue(char *pointer, Int_t i, Int_t j, Int_t len) const { return GetTypedValue<Double_t>(pointer, i, j, len); }
0193 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); }
0194 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); }
0195 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); }
0196 void ls(Option_t *option="") const override;
0197 Bool_t MatchLegacyCheckSum(UInt_t checksum) const;
0198 TVirtualStreamerInfo *NewInfo(TClass *cl) override { return new TStreamerInfo(cl); }
0199 void *New(void *obj = nullptr) override;
0200 void *NewArray(Long_t nElements, void* ary = nullptr) override;
0201 void Destructor(void* p, Bool_t dtorOnly = kFALSE) override;
0202 void DeleteArray(void* p, Bool_t dtorOnly = kFALSE) override;
0203 void PrintValue(const char *name, char *pointer, Int_t i, Int_t len, Int_t lenmax=1000) const;
0204 void PrintValueClones(const char *name, TClonesArray *clones, Int_t i, Int_t eoffset, Int_t lenmax=1000) const;
0205 void PrintValueSTL(const char *name, TVirtualCollectionProxy *cont, Int_t i, Int_t eoffset, Int_t lenmax=1000) const;
0206
0207 template <class T>
0208 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);
0209 template <class T>
0210 Int_t ReadBufferSkip(TBuffer &b, const T &arrptr, const TCompInfo *compinfo,Int_t kase, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
0211 template <class T>
0212 Int_t ReadBufferConv(TBuffer &b, const T &arrptr, const TCompInfo *compinfo,Int_t kase, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
0213 template <class T>
0214 Int_t ReadBufferArtificial(TBuffer &b, const T &arrptr, TStreamerElement *aElement, Int_t narr, Int_t eoffset);
0215
0216 Int_t ReadBufferClones(TBuffer &b, TClonesArray *clones, Int_t nc, Int_t first, Int_t eoffset);
0217 Int_t ReadBufferSTL(TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc, Int_t eoffset, Bool_t v7 = kTRUE );
0218 void SetCheckSum(UInt_t checksum) override { fCheckSum = checksum; }
0219 void SetClass(TClass *cl) override;
0220 void SetClassVersion(Int_t vers) override { fClassVersion = vers; }
0221 void SetOnFileClassVersion(Int_t vers) { fOnFileClassVersion = vers; }
0222 void TagFile(TFile *fFile) override;
0223 private:
0224
0225 Int_t WriteBuffer(TBuffer &b, char *pointer, Int_t first);
0226 Int_t WriteBufferClones(TBuffer &b, TClonesArray *clones, Int_t nc, Int_t first, Int_t eoffset);
0227 Int_t WriteBufferSTL (TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc);
0228 Int_t WriteBufferSTLPtrs( TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc, Int_t first, Int_t eoffset);
0229 public:
0230 void Update(const TClass *oldClass, TClass *newClass) override;
0231
0232
0233
0234
0235
0236
0237
0238 TVirtualStreamerInfo *GenerateInfoForPair(const std::string &pairclassname, bool silent, size_t hint_pair_offset, size_t hint_pair_size) override;
0239 TVirtualStreamerInfo *GenerateInfoForPair(const std::string &firstname, const std::string &secondname, bool silent, size_t hint_pair_offset, size_t hint_pair_size) override;
0240
0241 TVirtualCollectionProxy *GenEmulatedProxy(const char* class_name, Bool_t silent) override;
0242 TClassStreamer *GenEmulatedClassStreamer(const char* class_name, Bool_t silent) override;
0243 TVirtualCollectionProxy *GenExplicitProxy(const ::ROOT::Detail::TCollectionProxyInfo &info, TClass *cl) override;
0244 TClassStreamer *GenExplicitClassStreamer(const ::ROOT::Detail::TCollectionProxyInfo &info, TClass *cl) override;
0245
0246 static TStreamerElement *GetCurrentElement();
0247
0248 public:
0249
0250 template <class T>
0251 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);
0252
0253
0254 ClassDefOverride(TStreamerInfo, 10)
0255 };
0256
0257
0258 #endif