37 const Int_t kMapOffset = 2;
43 TConvertClonesArrayToProxy::TConvertClonesArrayToProxy(
44 TVirtualCollectionProxy *proxy,
45 Bool_t isPointer, Bool_t isPrealloc) :
46 fIsPointer(isPointer),
47 fIsPrealloc(isPrealloc),
48 fCollectionClass(proxy?proxy->GetCollectionClass():0)
50 if (isPointer) fOffset =
sizeof(TClonesArray*);
51 else fOffset =
sizeof(TClonesArray);
57 TConvertClonesArrayToProxy::~TConvertClonesArrayToProxy()
64 void TConvertClonesArrayToProxy::operator()(TBuffer &b,
void *pmember, Int_t size)
68 TVirtualCollectionProxy *proxy = fCollectionClass->GetCollectionProxy();
69 TStreamerInfo *subinfo = (TStreamerInfo*)proxy->GetValueClass()->GetStreamerInfo();
72 Int_t nobjects, dummy;
77 UInt_t start, bytecount;
79 R__ASSERT(b.IsReading());
81 Bool_t needAlloc = fIsPointer && !fIsPrealloc;
84 char *addr = (
char*)pmember;
85 for(Int_t k=0; k<size; ++k, addr += fOffset ) {
86 if (*(
void**)addr && TStreamerInfo::CanDelete()) {
87 proxy->GetValueClass()->Destructor(*(
void**)addr,kFALSE);
94 char *addr = (
char*)pmember;
96 for(Int_t k=0; k<size; ++k, addr += fOffset ) {
105 UInt_t startpos = b.Length();
109 TClass *clRef = b.ReadClass(TClonesArray::Class(), &tag);
113 if (b.GetBufferVersion() > 0) {
114 tag += b.GetBufferDisplacement();
116 if (tag > (UInt_t)b.GetMapCount()) {
117 Error(
"TConvertClonesArrayToProxy",
"object tag too large, I/O buffer corrupted");
122 b.GetMappedObject( tag, objptr, clRef);
123 if ( objptr == (
void*)-1 ) {
124 Error(
"TConvertClonesArrayToProxy",
125 "Object can not be found in the buffer's map (at %d)",tag);
129 if (b.GetBufferVersion()==0)
continue;
133 b.MapObject(*(
void**)addr, fCollectionClass, 0);
134 Int_t currentpos = b.Length();
135 b.SetBufferOffset( tag - kMapOffset );
137 (*this)(b,&objptr,1);
138 b.SetBufferOffset( currentpos);
140 if (objptr==0)
continue;
142 clRef = fCollectionClass;
146 if (clRef==TClonesArray::Class()) {
147 Error(
"TConvertClonesArrayToProxy",
148 "Object refered to has not been converted from TClonesArray to %s",
149 fCollectionClass->GetName());
151 }
else if (clRef!=fCollectionClass) {
152 Error(
"TConvertClonesArrayToProxy",
153 "Object refered to is of type %s instead of %s",
154 clRef->GetName(),fCollectionClass->GetName());
157 *(
void**)addr = objptr;
160 }
else if (clRef != TClonesArray::Class()) {
161 Warning(
"TConvertClonesArrayToProxy",
162 "Only the TClonesArray part of %s will be read into %s!\n",
163 (clRef!=((TClass*)-1)&&clRef) ? clRef->GetName() :
"N/A",
164 fCollectionClass->GetName());
166 *(
void**)addr = proxy->New();
167 if (b.GetBufferVersion()>0) {
168 b.MapObject(*(
void**)addr, fCollectionClass, startpos+kMapOffset);
170 b.MapObject(*(
void**)addr, fCollectionClass, b.GetMapCount() );
175 if (fIsPointer) obj = *(
void**)addr;
179 Version_t v = b.ReadVersion(&start, &bytecount);
185 if (v > 2) objdummy.Streamer(b);
187 if (v > 1) fName.Streamer(b);
189 strncpy(classv,s.Data(),255);
191 char *semicolon = strchr(classv,
';');
196 TClass *cl = TClass::GetClass(classv);
198 printf(
"TClonesArray::Streamer expecting class %s\n", classv);
199 b.CheckByteCount(start, bytecount, TClonesArray::Class());
204 if (nobjects < 0) nobjects = -nobjects;
206 if (cl != subinfo->GetClass()) {
207 Error(
"TClonesArray::Conversion to vector",
"Bad class");
209 TVirtualCollectionProxy::TPushPop helper( proxy, obj );
210 env = proxy->Allocate(nobjects,
true);
212 if (objdummy.TestBit(TClonesArray::kBypassStreamer)) {
214 subinfo->ReadBufferSTL(b,proxy,nobjects,0);
217 for (Int_t i = 0; i < nobjects; i++) {
220 void* elem = proxy->At(i);
221 b.StreamObject(elem,subinfo->GetClass());
226 b.CheckByteCount(start, bytecount,TClonesArray::Class());
233 TConvertMapToProxy::TConvertMapToProxy(TClassStreamer *streamer,
234 Bool_t isPointer, Bool_t isPrealloc) :
235 fIsPointer(isPointer),
236 fIsPrealloc(isPrealloc),
240 TCollectionClassStreamer *middleman =
dynamic_cast<TCollectionClassStreamer*
>(streamer);
242 TVirtualCollectionProxy *proxy = middleman->GetXYZ();
243 TGenCollectionStreamer *collStreamer =
dynamic_cast<TGenCollectionStreamer*
>(proxy);
245 fCollectionClass = proxy->GetCollectionClass();
247 if (isPointer) fSizeOf =
sizeof(
void*);
248 else fSizeOf = fCollectionClass->Size();
250 if (proxy->GetValueClass()->GetStreamerInfo() == 0
251 || proxy->GetValueClass()->GetStreamerInfo()->GetElements()->At(1) == 0 ) {
255 if (!collStreamer) fCollectionClass = 0;
264 void TConvertMapToProxy::operator()(TBuffer &b,
void *pmember, Int_t size)
266 R__ASSERT(b.IsReading());
267 R__ASSERT(fCollectionClass);
271 TCollectionClassStreamer *middleman =
dynamic_cast<TCollectionClassStreamer*
>(fCollectionClass->GetStreamer());
272 TVirtualCollectionProxy *proxy = middleman->GetXYZ();
273 TGenCollectionStreamer *collStreamer =
dynamic_cast<TGenCollectionStreamer*
>(proxy);
275 Bool_t needAlloc = fIsPointer && !fIsPrealloc;
277 R__ASSERT(!needAlloc);
280 char *addr = (
char*)pmember;
281 for(Int_t k=0; k<size; ++k, addr += fSizeOf ) {
282 if (*(
void**)addr && TStreamerInfo::CanDelete()) {
283 proxy->GetValueClass()->Destructor(*(
void**)addr,kFALSE);
291 char *addr = (
char*)pmember;
293 for(Int_t k=0; k<size; ++k, addr += fSizeOf) {
302 if (fIsPointer) obj = *(
void**)addr;
305 TVirtualCollectionProxy::TPushPop env(proxy, obj);
306 collStreamer->StreamerAsMap(b);