16 #include "TBaseClass.h"
17 #include "TDataMember.h"
18 #include "TClassEdit.h"
19 #include "TDataType.h"
22 #include "TStreamerInfo.h"
39 UInt_t CalculateCheckSum (TClass*
cl,
const char* name_in)
43 TString
name = name_in;
48 TList *tlb =
cl->GetListOfBases();
54 while((tbc=(TBaseClass*)nextBase())) {
55 name = tbc->GetName();
60 TList *tlm =
cl->GetListOfDataMembers();
65 while((tdm=(TDataMember*)nextMemb())) {
66 if (!tdm->IsPersistent())
continue;
68 prop = (tdm->Property());
69 TDataType*
tdt = tdm->GetDataType();
70 if (
tdt) prop |=
tdt->Property();
72 if ( prop&kIsStatic)
continue;
74 if (prop&kIsEnum)
id =
id*3 + 1;
78 type = tdm->GetFullTypeName();
83 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
84 if (TClassEdit::IsSTLCont(
type) != ROOT::kNotSTL)
85 type = TClassEdit::ShortType(
type, TClassEdit::kDropStlDefault );
91 int dim = tdm->GetArrayDim();
93 for (
int i=0;
i<
dim;
i++)
id =
id*3+tdm->GetMaxIndex(
i);
114 : fTransClass (trans_cls),
115 fPersClass (pers_cls),
116 fCheckSum (checksum),
133 : fTransClass (trans_cls),
134 fPersClass (pers_cls),
135 fCheckSum (fTransClass ?
136 CalculateCheckSum (fPersClass, fTransClass->GetName()) : 0),
153 const std::string& trans_cls,
154 const std::string& pers_cls)
155 : fTransClass (ToClass (trans_cls)),
156 fPersClass (ToClass (pers_cls)),
157 fCheckSum (checksum),
175 const std::string& pers_cls)
176 : fTransClass (ToClass (trans_cls)),
177 fPersClass (ToClass (pers_cls)),
178 fCheckSum (CalculateCheckSum (fPersClass, fTransClass->GetName())),
193 Error (
"TVirtualConverter",
194 "Both transient and persistent classes are null.");
196 Error (
"TVirtualConverter",
197 "Transient class is null for persistent class `%s'",
201 Error (
"TVirtualConverter",
202 "Persistent class is null for transient class `%s'",
313 return gROOT->GetClass (
name.c_str());
325 TClass*
cl = gROOT->GetClass (
id);
331 const char*
name =
id.name();
332 cl = gROOT->GetClass (
name);
335 const char* n2 =
name;
338 cl = gROOT->GetClass (n2);
342 char* demname =
nullptr;
347 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
348 demname = TClassEdit::DemangleTypeIdName (
id, errorCode);
351 cl = gROOT->GetClass (demname);
374 const TObjArray* trans_sis =
fTransClass->GetStreamerInfos();
375 if (trans_sis->GetLast() !=
fOldLast) {
384 const TObjArray* pers_sis =
fPersClass->GetStreamerInfos();
385 assert (trans_sis->LowerBound() == pers_sis->LowerBound());
386 for (Int_t
v = trans_sis->LowerBound(); v <= trans_sis->GetLast(); ++
v) {
388 trans_sis->At(
v) != 0 &&
389 (
v > pers_sis->GetLast() || pers_sis->At(
v) == 0))
395 TStreamerInfo* new_si =(TStreamerInfo*)(trans_sis->At(
v)->Clone());