36 Int_t TBufferIO::fgMapSize = kMapSize;
43 TBufferIO::TBufferIO(TBuffer::EMode mode) : TBuffer(mode)
51 TBufferIO::TBufferIO(TBuffer::EMode mode, Int_t bufsiz) : TBuffer(mode, bufsiz)
59 TBufferIO::TBufferIO(TBuffer::EMode mode, Int_t bufsiz,
void *buf, Bool_t adopt, ReAllocCharFun_t reallocfunc)
60 : TBuffer(mode, bufsiz, buf, adopt, reallocfunc)
68 TBufferIO::~TBufferIO()
77 Int_t TBufferIO::GetVersionOwner()
const
79 TFile *file = (TFile *)GetParent();
81 return file->GetVersion();
97 void TBufferIO::SetReadParam(Int_t mapsize)
99 R__ASSERT(IsReading());
100 R__ASSERT(fMap ==
nullptr);
117 void TBufferIO::SetWriteParam(Int_t mapsize)
119 R__ASSERT(IsWriting());
120 R__ASSERT(fMap ==
nullptr);
129 void TBufferIO::InitMap()
133 fMap =
new TExMap(fMapSize);
140 fMap =
new TExMap(fMapSize);
141 fMap->Add(0, kNullTag);
143 }
else if (fMapCount == 0) {
144 fMap->Add(0, kNullTag);
148 fClassMap =
new TExMap(fMapSize);
149 fClassMap->Add(0, kNullTag);
163 void TBufferIO::MapObject(
const TObject *obj, UInt_t offset)
171 ULong_t hash = Void_Hash(obj);
172 fMap->Add(hash, (Long_t)obj, offset);
178 if (!fMap || !fClassMap)
181 fMap->Add(offset, (Long_t)obj);
182 fClassMap->Add(offset, (obj && obj != (TObject *)-1) ? (Long_t)((TObject *)obj)->IsA() : 0);
196 void TBufferIO::MapObject(
const void *obj,
const TClass *cl, UInt_t offset)
204 ULong_t hash = Void_Hash(obj);
205 fMap->Add(hash, (Long_t)obj, offset);
211 if (!fMap || !fClassMap)
214 fMap->Add(offset, (Long_t)obj);
215 fClassMap->Add(offset, (Long_t)cl);
225 Bool_t TBufferIO::CheckObject(
const TObject *obj)
227 return CheckObject(obj, TObject::Class());
235 Bool_t TBufferIO::CheckObject(
const void *obj,
const TClass *ptrClass)
237 if (!obj || !fMap || !ptrClass)
240 TClass *clActual = ptrClass->GetActualClass(obj);
244 if (clActual && (ptrClass != clActual)) {
245 const char *temp = (
const char *)obj;
246 temp -= clActual->GetBaseClassOffset(ptrClass);
247 idx = (ULong_t)fMap->GetValue(Void_Hash(temp), (Long_t)temp);
249 idx = (ULong_t)fMap->GetValue(Void_Hash(obj), (Long_t)obj);
252 return idx ? kTRUE : kFALSE;
260 void TBufferIO::GetMappedObject(UInt_t tag,
void *&ptr, TClass *&ClassPtr)
const
268 ptr = (
void *)(Long_t)fMap->GetValue(tag);
269 ClassPtr = (TClass *)(Long_t)fClassMap->GetValue(tag);
277 Long64_t TBufferIO::GetObjectTag(
const void *obj)
282 return fMap->GetValue(Void_Hash(obj), (Long_t)obj);
288 void TBufferIO::ResetMap()
305 void TBufferIO::Reset()
319 void TBufferIO::SetPidOffset(UShort_t offset)
329 void TBufferIO::ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t force)
332 info->ForceWriteInfo((TFile *)GetParent(), force);
341 void TBufferIO::ForceWriteInfoClones(TClonesArray *a)
343 TStreamerInfo *sinfo = (TStreamerInfo *)a->GetClass()->GetStreamerInfo();
344 ForceWriteInfo(sinfo, kFALSE);
350 void TBufferIO::TagStreamerInfo(TVirtualStreamerInfo *info)
352 TFile *file = (TFile *)GetParent();
354 TArrayC *cindex = file->GetClassIndex();
355 Int_t nindex = cindex->GetSize();
356 Int_t number = info->GetNumber();
357 if (number < 0 || number >= nindex) {
358 Error(
"TagStreamerInfo",
"StreamerInfo: %s number: %d out of range[0,%d] in file: %s", info->GetName(), number,
359 nindex, file->GetName());
362 if (cindex->fArray[number] == 0) {
363 cindex->fArray[0] = 1;
364 cindex->fArray[number] = 1;
372 Int_t TBufferIO::ReadClones(TClonesArray *a, Int_t nobjects, Version_t objvers)
374 char **arr = (
char **)a->GetObjectRef(0);
375 char **end = arr + nobjects;
377 TStreamerInfo *info = (TStreamerInfo *)a->GetClass()->GetStreamerInfo(objvers);
379 return ApplySequenceVecPtr(*(info->GetReadMemberWiseActions(kTRUE)), arr, end);
385 Int_t TBufferIO::WriteClones(TClonesArray *a, Int_t nobjects)
387 char **arr =
reinterpret_cast<char **
>(a->GetObjectRef(0));
389 TStreamerInfo *info = (TStreamerInfo *)a->GetClass()->GetStreamerInfo();
391 char **end = arr + nobjects;
393 return ApplySequenceVecPtr(*(info->GetWriteMemberWiseActions(kTRUE)), arr, end);
399 TProcessID *TBufferIO::GetLastProcessID(TRefTable *reftable)
const
401 TFile *file = (TFile *)GetParent();
403 if (file && !reftable->TestBit(TRefTable::kHaveWarnedReadingOld) && file->GetNProcessIDs() > 1) {
404 Warning(
"ReadBuffer",
"The file was written during several processes with an "
405 "older ROOT version; the TRefTable entries might be inconsistent.");
406 reftable->SetBit(TRefTable::kHaveWarnedReadingOld);
410 TProcessID *fileProcessID = TProcessID::GetProcessID(0);
411 if (file && file->GetNProcessIDs() > 0) {
413 fileProcessID = (TProcessID *)file->GetListOfProcessIDs()->Last();
415 return fileProcessID;
422 TProcessID *TBufferIO::ReadProcessID(UShort_t pidf)
424 TFile *file = (TFile *)GetParent();
427 return TProcessID::GetPID();
431 TProcessID *pid =
nullptr;
433 R__LOCKGUARD_IMT(gInterpreterMutex);
434 pid = file->ReadProcessID(pidf);
447 UInt_t TBufferIO::GetTRefExecId()
449 return TStreamerInfo::GetCurrentElement()->GetUniqueID();
456 UShort_t TBufferIO::WriteProcessID(TProcessID *pid)
458 TFile *file = (TFile *)GetParent();
461 return file->WriteProcessID(pid);
471 virtual ~DynamicType() {}
492 Int_t TBufferIO::WriteObjectAny(
const void *obj,
const TClass *ptrClass, Bool_t cacheReuse )
495 WriteObjectClass(
nullptr,
nullptr, kTRUE);
500 Error(
"WriteObjectAny",
"ptrClass argument may not be 0");
504 TClass *clActual = ptrClass->GetActualClass(obj);
506 if (clActual == 0 || clActual->GetState() == TClass::kForwardDeclared) {
510 DynamicType *d_ptr = (DynamicType *)obj;
511 Warning(
"WriteObjectAny",
"An object of type %s (from type_info) passed through a %s pointer was truncated (due "
512 "a missing dictionary)!!!",
513 typeid(*d_ptr).name(), ptrClass->GetName());
514 WriteObjectClass(obj, ptrClass, cacheReuse);
516 }
else if (clActual && (clActual != ptrClass)) {
517 const char *temp = (
const char *)obj;
518 temp -= clActual->GetBaseClassOffset(ptrClass);
519 WriteObjectClass(temp, clActual, cacheReuse);
522 WriteObjectClass(obj, ptrClass, cacheReuse);
530 void TBufferIO::WriteObject(
const TObject *obj, Bool_t cacheReuse)
532 WriteObjectAny(obj, TObject::Class(), cacheReuse);
548 void TBufferIO::SetGlobalReadParam(Int_t mapsize)
564 void TBufferIO::SetGlobalWriteParam(Int_t mapsize)
572 Int_t TBufferIO::GetGlobalReadParam()
580 Int_t TBufferIO::GetGlobalWriteParam()