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)