00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TVirtualCollectionProxy
00013 #define ROOT_TVirtualCollectionProxy
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef ROOT_TObject
00026 #include "TObject.h"
00027 #endif
00028 #include "TClassRef.h"
00029 #include "TDataType.h"
00030
00031
00032
00033
00034 #define ROOT_COLLECTIONPROXY_VERSION 3
00035
00036 class TClass;
00037 namespace TStreamerInfoActions {
00038 class TActionSequence;
00039 }
00040
00041 class TVirtualCollectionProxy {
00042 private:
00043 TVirtualCollectionProxy(const TVirtualCollectionProxy&);
00044 TVirtualCollectionProxy& operator=(const TVirtualCollectionProxy&);
00045
00046 protected:
00047 TClassRef fClass;
00048 UInt_t fProperties;
00049 virtual void SetValueClass(TClass *newcl) = 0;
00050 friend class TClass;
00051
00052 public:
00053 enum EProperty {
00054 kIsInitialized = BIT(1),
00055 kIsAssociative = BIT(2),
00056 kIsEmulated = BIT(3)
00057 };
00058
00059 class TPushPop {
00060
00061
00062 public:
00063 TVirtualCollectionProxy *fProxy;
00064 inline TPushPop(TVirtualCollectionProxy *proxy,
00065 void *objectstart) : fProxy(proxy) { fProxy->PushProxy(objectstart); }
00066 inline ~TPushPop() { fProxy->PopProxy(); }
00067 private:
00068 TPushPop(const TPushPop&);
00069 TPushPop& operator=(const TPushPop&);
00070 };
00071
00072 TVirtualCollectionProxy() : fClass(), fProperties(0) {};
00073 TVirtualCollectionProxy(TClass *cl) : fClass(cl), fProperties(0) {};
00074
00075 virtual TVirtualCollectionProxy* Generate() const = 0;
00076 virtual ~TVirtualCollectionProxy() {};
00077
00078 virtual TClass *GetCollectionClass() { return fClass; }
00079
00080
00081 virtual Int_t GetCollectionType() = 0;
00082
00083
00084 virtual ULong_t GetIncrement() = 0;
00085
00086
00087 virtual Int_t GetProperties() { return fProperties; }
00088
00089
00090 virtual void *New() const {
00091
00092 return fClass.GetClass()==0 ? 0 : fClass->New();
00093 }
00094 virtual void *New(void *arena) const {
00095
00096 return fClass.GetClass()==0 ? 0 : fClass->New(arena);
00097 }
00098
00099 virtual void *NewArray(Int_t nElements) const {
00100
00101 return fClass.GetClass()==0 ? 0 : fClass->NewArray(nElements);
00102 }
00103 virtual void *NewArray(Int_t nElements, void *arena) const {
00104
00105 return fClass.GetClass()==0 ? 0 : fClass->NewArray(nElements, arena);
00106 }
00107
00108 virtual void Destructor(void *p, Bool_t dtorOnly = kFALSE) {
00109
00110 TClass* cl = fClass.GetClass();
00111 if (cl) cl->Destructor(p, dtorOnly);
00112 }
00113
00114 virtual void DeleteArray(void *p, Bool_t dtorOnly = kFALSE) {
00115
00116 TClass* cl = fClass.GetClass();
00117 if (cl) cl->DeleteArray(p, dtorOnly);
00118 }
00119
00120 virtual UInt_t Sizeof() const = 0;
00121
00122
00123 virtual void PushProxy(void *objectstart) = 0;
00124
00125
00126 virtual void PopProxy() = 0;
00127
00128
00129 virtual Bool_t HasPointers() const = 0;
00130
00131
00132 virtual TClass *GetValueClass() = 0;
00133
00134
00135 virtual EDataType GetType() = 0;
00136
00137
00138 virtual void *At(UInt_t idx) = 0;
00139
00140
00141 virtual void Clear(const char *opt = "") = 0;
00142
00143
00144 virtual UInt_t Size() const = 0;
00145
00146
00147 virtual void* Allocate(UInt_t n, Bool_t forceDelete) = 0;
00148
00149 virtual void Commit(void*) = 0;
00150
00151 char *operator[](UInt_t idx) const { return (char*)(const_cast<TVirtualCollectionProxy*>(this))->At(idx); }
00152
00153
00154 virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version) = 0;
00155 virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version) = 0;
00156 virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions() = 0;
00157
00158
00159 static const Int_t fgIteratorArenaSize = 16;
00160
00161 typedef void (*CreateIterators_t)(void *collection, void **begin_arena, void **end_arena);
00162 virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE) = 0;
00163
00164
00165
00166
00167 typedef void* (*CopyIterator_t)(void *dest, const void *source);
00168 virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE) = 0;
00169
00170
00171
00172
00173 typedef void* (*Next_t)(void *iter, const void *end);
00174 virtual Next_t GetFunctionNext(Bool_t read = kTRUE) = 0;
00175
00176
00177
00178
00179
00180
00181 typedef void (*DeleteIterator_t)(void *iter);
00182 typedef void (*DeleteTwoIterators_t)(void *begin, void *end);
00183
00184 virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE) = 0;
00185 virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE) = 0;
00186
00187
00188
00189 };
00190
00191 #endif