15 #include "TBaseClass.h"
18 #include "TClassEdit.h"
19 #include "TDataMember.h"
20 #include "TDataType.h"
23 #include "TStreamerInfo.h"
38 UInt_t CalculateCheckSum (TClass*
cl,
const char* name_in)
42 TString
name = name_in;
47 TList *tlb =
cl->GetListOfBases();
53 while((tbc=(TBaseClass*)nextBase())) {
54 name = tbc->GetName();
59 TList *tlm =
cl->GetListOfDataMembers();
64 while((tdm=(TDataMember*)nextMemb())) {
65 if (!tdm->IsPersistent())
continue;
67 prop = (tdm->Property());
68 TDataType*
tdt = tdm->GetDataType();
69 if (
tdt) prop |=
tdt->Property();
71 if ( prop&kIsStatic)
continue;
73 if (prop&kIsEnum)
id =
id*3 + 1;
77 type = tdm->GetFullTypeName();
82 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
83 if (TClassEdit::IsSTLCont(
type) != ROOT::kNotSTL)
84 type = TClassEdit::ShortType(
type, TClassEdit::kDropStlDefault );
90 int dim = tdm->GetArrayDim();
92 for (
int i=0;
i<
dim;
i++)
id =
id*3+tdm->GetMaxIndex(
i);
113 : fTransClass (trans_cls),
114 fPersClass (pers_cls),
115 fCheckSum (checksum),
132 : fTransClass (trans_cls),
133 fPersClass (pers_cls),
134 fCheckSum (fTransClass ?
135 CalculateCheckSum (fPersClass, fTransClass->GetName()) : 0),
152 const std::string& trans_cls,
153 const std::string& pers_cls)
154 : fTransClass (ToClass (trans_cls)),
155 fPersClass (ToClass (pers_cls)),
156 fCheckSum (checksum),
174 const std::string& pers_cls)
175 : fTransClass (ToClass (trans_cls)),
176 fPersClass (ToClass (pers_cls)),
177 fCheckSum (CalculateCheckSum (fPersClass, fTransClass->GetName())),
192 Error (
"TVirtualConverter",
193 "Both transient and persistent classes are null.");
195 Error (
"TVirtualConverter",
196 "Transient class is null for persistent class `%s'",
200 Error (
"TVirtualConverter",
201 "Persistent class is null for transient class `%s'",
312 return gROOT->GetClass (
name.c_str());
324 TClass*
cl = gROOT->GetClass (
id);
330 const char*
name =
id.name();
331 cl = gROOT->GetClass (
name);
334 const char* n2 =
name;
337 cl = gROOT->GetClass (n2);
341 char* demname =
nullptr;
346 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
347 demname = TClassEdit::DemangleTypeIdName (
id, errorCode);
350 cl = gROOT->GetClass (demname);
373 const TObjArray* trans_sis =
fTransClass->GetStreamerInfos();
374 if (trans_sis->GetLast() !=
fOldLast) {
383 const TObjArray* pers_sis =
fPersClass->GetStreamerInfos();
384 assert (trans_sis->LowerBound() == pers_sis->LowerBound());
385 for (Int_t
v = trans_sis->LowerBound(); v <= trans_sis->GetLast(); ++
v) {
387 trans_sis->At(
v) != 0 &&
388 (
v > pers_sis->GetLast() || pers_sis->At(
v) == 0))
394 TStreamerInfo* new_si =(TStreamerInfo*)(trans_sis->At(
v)->Clone());
413 : fTransClass (nullptr),
414 fPersClass (nullptr),