12 #ifndef ROOT_TVirtualCollectionProxy
13 #define ROOT_TVirtualCollectionProxy
32 #define ROOT_COLLECTIONPROXY_VERSION 3
35 namespace TStreamerInfoActions {
36 class TActionSequence;
39 class TVirtualCollectionProxy {
41 TVirtualCollectionProxy(
const TVirtualCollectionProxy&);
42 TVirtualCollectionProxy& operator=(
const TVirtualCollectionProxy&);
47 virtual void UpdateValueClass(
const TClass *oldcl, TClass *newcl) = 0;
54 kIsAssociative = BIT(2),
64 TVirtualCollectionProxy *fProxy;
65 inline TPushPop(TVirtualCollectionProxy *proxy,
66 void *objectstart) : fProxy(proxy) { fProxy->PushProxy(objectstart); }
67 inline ~TPushPop() { fProxy->PopProxy(); }
69 TPushPop(
const TPushPop&);
70 TPushPop& operator=(
const TPushPop&);
73 TVirtualCollectionProxy() : fClass(), fProperties(0) {};
74 TVirtualCollectionProxy(TClass *cl) : fClass(cl), fProperties(0) {};
76 virtual TVirtualCollectionProxy* Generate()
const = 0;
77 virtual ~TVirtualCollectionProxy() {};
79 virtual TClass *GetCollectionClass()
const {
return fClass; }
82 virtual Int_t GetCollectionType()
const = 0;
85 virtual ULong_t GetIncrement()
const = 0;
88 virtual Int_t GetProperties()
const {
return fProperties; }
91 virtual void *New()
const {
93 return fClass.GetClass()==0 ? 0 : fClass->New();
95 virtual void *New(
void *arena)
const {
97 return fClass.GetClass()==0 ? 0 : fClass->New(arena);
100 virtual void *NewArray(Int_t nElements)
const {
102 return fClass.GetClass()==0 ? 0 : fClass->NewArray(nElements);
104 virtual void *NewArray(Int_t nElements,
void *arena)
const {
106 return fClass.GetClass()==0 ? 0 : fClass->NewArray(nElements, arena);
109 virtual void Destructor(
void *p, Bool_t dtorOnly = kFALSE)
const {
111 TClass* cl = fClass.GetClass();
112 if (cl) cl->Destructor(p, dtorOnly);
115 virtual void DeleteArray(
void *p, Bool_t dtorOnly = kFALSE)
const {
117 TClass* cl = fClass.GetClass();
118 if (cl) cl->DeleteArray(p, dtorOnly);
121 virtual UInt_t Sizeof()
const = 0;
124 virtual void PushProxy(
void *objectstart) = 0;
127 virtual void PopProxy() = 0;
130 virtual Bool_t HasPointers()
const = 0;
133 virtual TClass *GetValueClass()
const = 0;
136 virtual EDataType GetType()
const = 0;
139 virtual void *At(UInt_t idx) = 0;
142 virtual void Clear(
const char *opt =
"") = 0;
145 virtual UInt_t Size()
const = 0;
148 virtual void* Allocate(UInt_t n, Bool_t forceDelete) = 0;
150 virtual void Commit(
void*) = 0;
152 virtual void Insert(
const void *data,
void *container,
size_t size) = 0;
156 char *operator[](UInt_t idx)
const {
return (
char*)(
const_cast<TVirtualCollectionProxy*
>(
this))->At(idx); }
159 virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version) = 0;
160 virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version) = 0;
161 virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions() = 0;
164 static const Int_t fgIteratorArenaSize = 16;
166 typedef void (*CreateIterators_t)(
void *collection,
void **begin_arena,
void **end_arena, TVirtualCollectionProxy *proxy);
167 virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE) = 0;
172 typedef void* (*CopyIterator_t)(
void *dest,
const void *source);
173 virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE) = 0;
179 typedef void* (*Next_t)(
void *iter,
const void *end);
180 virtual Next_t GetFunctionNext(Bool_t read = kTRUE) = 0;
187 typedef void (*DeleteIterator_t)(
void *iter);
188 typedef void (*DeleteTwoIterators_t)(
void *begin,
void *end);
190 virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE) = 0;
191 virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE) = 0;