11 #ifndef ROOT_TGenCollectionProxy
12 #define ROOT_TGenCollectionProxy
26 class TCollectionProxyFactory;
28 class TGenCollectionProxy
29 :
public TVirtualCollectionProxy
33 friend class TCollectionProxyFactory;
38 typedef const std::type_info& Info_t;
40 typedef const std::type_info& Info_t;
46 kBIT_ISSTRING = 0x20000000,
47 kBIT_ISTSTRING = 0x40000000
60 ROOT::NewFunc_t fCtor;
61 ROOT::DesFunc_t fDtor;
62 ROOT::DelFunc_t fDelete;
72 Value(
const std::string& info, Bool_t silent);
74 void DeleteItem(
void* ptr);
100 ULong64_t u_longlong;
106 return *(&this->p_void);
109 return (std::string*)
this;
111 const char* c_str() {
112 return ((std::string*)
this)->c_str();
114 const char* c_pstr() {
115 return (*(std::string**)
this)->c_str();
118 *(&this->p_void) = p;
120 void read_std_string(TBuffer& b) {
123 ((std::string*)
this)->assign(s.Data());
125 void* read_tstring(TBuffer& b) {
126 *((TString*)
this) =
"";
127 ((TString*)
this)->Streamer(b);
130 void read_std_string_pointer(TBuffer& b) {
132 std::string* str2 = (std::string*)ptr();
133 if (!str2) str2 =
new std::string();
138 void write_std_string_pointer(TBuffer& b) {
141 std::string* strptr = (*(std::string**)
this);
142 c = (
const char*)(strptr->c_str());
144 TString(c).Streamer(b);
146 void read_any_object(Value* v, TBuffer& b) {
152 else if ( v->fType ) {
153 v->fType->Destructor(p);
155 else if ( v->fDtor ) {
157 ::operator
delete(p);
160 ::operator
delete(p);
163 set( b.ReadObjectAny(v->fType) );
166 void read_tstring_pointer(Bool_t vsn3, TBuffer& b) {
167 TString* s = (TString*)ptr();
169 if ( !s ) s =
new TString();
176 set( b.ReadObjectAny(TString::Class()) );
178 void write_tstring_pointer(TBuffer& b) {
179 b.WriteObjectAny(ptr(), TString::Class());
194 typedef void* (*Call_t)(
void*);
196 Method() : call(0) { }
197 Method(Call_t c) : call(c) { }
198 Method(
const Method& m) : call(m.call) { }
199 Method &operator=(
const Method& m) { call = m.call;
return *
this; }
200 void* invoke(
void* obj)
const {
return (*call)(obj); }
214 typedef void* (*Call_t)();
216 Method0() : call(0) { }
217 Method0(Call_t c) : call(c) { }
218 Method0(
const Method0& m) : call(m.call) { }
219 Method0 &operator=(
const Method0& m) { call = m.call;
return *
this; }
220 void* invoke()
const {
return (*call)(); }
240 TStaging(
const TStaging&);
241 TStaging &operator=(
const TStaging&);
244 TStaging(
size_t size,
size_t size_of) : fTarget(0), fContent(0), fReserved(0), fSize(size), fSizeOf(size_of)
248 fContent = ::malloc(fReserved * fSizeOf);
262 return ((
char*)fContent) + fSize*fSizeOf;
272 void Resize(
size_t nelement) {
273 if (fReserved < nelement) {
274 fReserved = nelement;
275 fContent = ::realloc(fContent,fReserved * fSizeOf);
279 void SetTarget(
void *target) {
286 typedef ROOT::Detail::TCollectionProxyInfo::Environ<char[64]> Env_t;
287 typedef ROOT::Detail::TCollectionProxyInfo::EnvironBase EnvironBase_t;
288 typedef std::vector<TStaging*> Staged_t;
289 typedef std::vector<EnvironBase_t*> Proxies_t;
290 mutable TObjArray *fReadMemberWise;
291 mutable std::map<std::string, TObjArray*> *fConversionReadMemberWise;
292 mutable TStreamerInfoActions::TActionSequence *fWriteMemberWise;
293 typedef void (*Sizing_t)(
void *obj,
size_t size);
294 typedef void* (*Feedfunc_t)(
void *from,
void *to,
size_t size);
295 typedef void* (*Collectfunc_t)(
void *from,
void *to);
296 typedef void* (*ArrIterfunc_t)(
void *from,
size_t size);
305 ArrIterfunc_t fConstruct;
308 Collectfunc_t fCollect;
310 std::atomic<Value*> fValue;
316 Proxies_t fProxyList;
317 Proxies_t fProxyKept;
321 TClass* fOnFileClass;
323 CreateIterators_t fFunctionCreateIterators;
324 CopyIterator_t fFunctionCopyIterator;
325 Next_t fFunctionNextIterator;
326 DeleteIterator_t fFunctionDeleteIterator;
327 DeleteTwoIterators_t fFunctionDeleteTwoIterators;
330 TGenCollectionProxy* Initialize(Bool_t silent)
const;
332 virtual TGenCollectionProxy* InitializeEx(Bool_t silent);
334 virtual void DeleteItem(Bool_t force,
void* ptr)
const;
336 void CheckFunctions()
const;
339 virtual void UpdateValueClass(
const TClass *oldcl, TClass *newcl);
342 TGenCollectionProxy();
347 virtual TVirtualCollectionProxy* Generate()
const;
350 TGenCollectionProxy(
const TGenCollectionProxy& copy);
354 TGenCollectionProxy &operator=(
const TGenCollectionProxy&);
358 TGenCollectionProxy(Info_t typ,
size_t iter_size);
359 TGenCollectionProxy(
const ROOT::Detail::TCollectionProxyInfo &info, TClass *cl);
362 virtual ~TGenCollectionProxy();
365 virtual TClass *GetCollectionClass()
const;
368 virtual Int_t GetCollectionType()
const;
371 virtual ULong_t GetIncrement()
const;
374 virtual UInt_t Sizeof()
const;
377 virtual void PushProxy(
void *objstart);
380 virtual void PopProxy();
383 virtual Bool_t HasPointers()
const;
386 virtual TClass *GetValueClass()
const;
389 virtual EDataType GetType()
const;
392 virtual void *At(UInt_t idx);
395 virtual void Clear(
const char *opt =
"");
398 virtual void Resize(UInt_t n, Bool_t force_delete);
401 virtual UInt_t Size()
const;
404 virtual void* Allocate(UInt_t n, Bool_t forceDelete);
408 virtual void Insert(
const void *data,
void *container,
size_t size);
411 virtual void Commit(
void* env);
414 virtual void Streamer(TBuffer &refBuffer);
417 virtual void Streamer(TBuffer &refBuffer,
void *pObject,
int siz);
420 virtual void operator()(TBuffer &refBuffer,
void *pObject);
423 virtual void ReadBuffer(TBuffer &b,
void *obj);
424 virtual void ReadBuffer(TBuffer &b,
void *obj,
const TClass *onfileClass);
426 virtual void SetOnFileClass( TClass* cl ) { fOnFileClass = cl; }
427 virtual TClass* GetOnFileClass()
const {
return fOnFileClass; }
430 virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version);
431 virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version);
432 virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions();
436 virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE);
442 virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE);
449 virtual Next_t GetFunctionNext(Bool_t read = kTRUE);
457 virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE);
458 virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE);
466 template <
typename T>
467 struct AnyCollectionProxy :
public TGenCollectionProxy {
469 : TGenCollectionProxy(typeid(T::Cont_t),sizeof(T::Iter_t))
472 fValDiff =
sizeof(T::Value_t);
473 fValOffset = T::value_offset();
474 fSize.call = T::size;
476 fNext.call = T::next;
477 fFirst.call = T::first;
478 fClear.call = T::clear;
479 fConstruct = T::construct;
480 fDestruct = T::destruct;
484 virtual ~AnyCollectionProxy() { }