00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TBranchProxyTemplate
00013 #define ROOT_TBranchProxyTemplate
00014
00015 #if !defined(__CINT__) || defined(__MAKECINT__)
00016 #include "TBranchProxy.h"
00017 #endif
00018
00019 #define InjecTBranchProxyInterface() \
00020 TBranchProxy *GetProxy() { return obj.GetProxy(); } \
00021 void Reset() { obj.Reset(); } \
00022 bool Setup() { return obj.Setup(); } \
00023 bool IsInitialized() { return obj.IsInitialized(); } \
00024 bool IsaPointer() const { return obj.IsaPointer(); } \
00025 bool Read() { return obj.Read(); }
00026
00027 namespace ROOT {
00028 template <class T>
00029 class TObjProxy {
00030 TBranchProxy obj;
00031 public:
00032 InjecTBranchProxyInterface();
00033
00034 TObjProxy() : obj() {};
00035 TObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00036 TObjProxy(TBranchProxyDirector *director, const char *top, const char *name) :
00037 obj(director,top,name) {};
00038 TObjProxy(TBranchProxyDirector *director, const char *top, const char *name, const char *data) :
00039 obj(director,top,name,data) {};
00040 TObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) :
00041 obj(director,parent, name, top, mid) {};
00042 ~TObjProxy() {};
00043
00044 Int_t GetOffset() { return obj.GetOffset(); }
00045
00046 void Print() {
00047 obj.Print();
00048 cout << "fWhere " << obj.GetWhere() << endl;
00049 if (obj.GetWhere()) cout << "address? " << (T*)obj.GetWhere() << endl;
00050 }
00051
00052 T* GetPtr() {
00053
00054 if (!obj.Read()) return 0;
00055 T *temp = (T*)obj.GetStart();
00056
00057 return temp;
00058 }
00059
00060 T* operator->() { return GetPtr(); }
00061 operator T*() { return GetPtr(); }
00062
00063
00064 };
00065
00066 template <class T>
00067 class TClaObjProxy {
00068 TClaProxy obj;
00069 public:
00070 InjecTBranchProxyInterface();
00071
00072 void Print() {
00073 obj.Print();
00074 cout << "obj.GetWhere() " << obj.GetWhere() << endl;
00075
00076 }
00077
00078 TClaObjProxy() : obj() {};
00079 TClaObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00080 TClaObjProxy(TBranchProxyDirector *director, const char *top, const char *name) :
00081 obj(director,top,name) {};
00082 TClaObjProxy(TBranchProxyDirector *director, const char *top, const char *name, const char *data) :
00083 obj(director,top,name,data) {};
00084 TClaObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) :
00085 obj(director,parent, name, top, mid) {};
00086 ~TClaObjProxy() {};
00087
00088 const TClonesArray* GetPtr() { return obj.GetPtr(); }
00089
00090 Int_t GetEntries() { return obj.GetEntries(); }
00091
00092 const T* At(UInt_t i) {
00093 static T default_val;
00094 if (!obj.Read()) return &default_val;
00095 if (obj.GetWhere()==0) return &default_val;
00096
00097 T* temp = (T*)obj.GetClaStart(i);
00098 if (temp) return temp;
00099 else return &default_val;
00100 }
00101
00102 const T* operator [](Int_t i) { return At(i); }
00103 const T* operator [](UInt_t i) { return At(i); }
00104
00105 };
00106
00107 template <class T>
00108 class TStlObjProxy {
00109 TStlProxy obj;
00110 typedef T value_t;
00111 public:
00112 InjecTBranchProxyInterface();
00113
00114 void Print() {
00115 obj.Print();
00116 cout << "obj.GetWhere() " << obj.GetWhere() << endl;
00117
00118 }
00119
00120 TStlObjProxy() : obj() {};
00121 TStlObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00122 TStlObjProxy(TBranchProxyDirector *director, const char *top, const char *name) :
00123 obj(director,top,name) {};
00124 TStlObjProxy(TBranchProxyDirector *director, const char *top, const char *name, const char *data) :
00125 obj(director,top,name,data) {};
00126 TStlObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) :
00127 obj(director,parent, name, top, mid) {};
00128 ~TStlObjProxy() {};
00129
00130 TVirtualCollectionProxy* GetCollection() {
00131 return obj.GetPtr();
00132 }
00133
00134 Int_t GetEntries() { return obj.GetEntries(); }
00135
00136 const value_t& At(UInt_t i) {
00137 static const value_t default_val;
00138 if (!obj.Read()) return default_val;
00139 if (obj.GetWhere()==0) return default_val;
00140
00141 value_t *temp = (value_t*)obj.GetStlStart(i);
00142 if (temp) return *temp;
00143 else return default_val;
00144 }
00145
00146 const value_t& operator [](Int_t i) { return At(i); }
00147 const value_t& operator [](UInt_t i) { return At(i); }
00148
00149 };
00150
00151
00152 template <class T>
00153 class TStlSimpleProxy : TObjProxy<T> {
00154
00155
00156 TVirtualCollectionProxy *fCollection;
00157 typedef typename T::value_type value_t;
00158 public:
00159
00160 TStlSimpleProxy() : ROOT::TObjProxy<T>(),fCollection(0) {};
00161 TStlSimpleProxy(TBranchProxyDirector *director, const char *name) : ROOT::TObjProxy<T>(director,name),fCollection(0) {};
00162 TStlSimpleProxy(TBranchProxyDirector *director, const char *top, const char *name) :
00163 ROOT::TObjProxy<T>(director,top,name),fCollection(0) {};
00164 TStlSimpleProxy(TBranchProxyDirector *director, const char *top, const char *name, const char *data) :
00165 ROOT::TObjProxy<T>(director,top,name,data),fCollection(0) {};
00166 TStlSimpleProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) :
00167 ROOT::TObjProxy<T>(director,parent, name, top, mid),fCollection(0) {};
00168 ~TStlSimpleProxy() { delete fCollection; };
00169
00170 TVirtualCollectionProxy* GetCollection() {
00171 if (fCollection==0) {
00172 TClass *cl = TClass::GetClass(typeid(T));
00173 if (cl && cl->GetCollectionProxy()) {
00174 fCollection = cl->GetCollectionProxy()->Generate();
00175 }
00176 }
00177 return fCollection;
00178 }
00179
00180 Int_t GetEntries() {
00181 T *temp = ROOT::TObjProxy<T>::GetPtr();
00182 if (temp) {
00183 GetCollection();
00184 if (!fCollection) return 0;
00185 TVirtualCollectionProxy::TPushPop helper( fCollection, temp );
00186 return fCollection->Size();
00187 }
00188 return 0;
00189 }
00190
00191 const value_t At(UInt_t i) {
00192 static value_t default_val;
00193 T *temp = ROOT::TObjProxy<T>::GetPtr();
00194 if (temp) {
00195 GetCollection();
00196 if (!fCollection) return 0;
00197 TVirtualCollectionProxy::TPushPop helper( fCollection, temp );
00198 return *(value_t*)(fCollection->At(i));
00199 }
00200 else return default_val;
00201 }
00202
00203 const value_t operator [](Int_t i) { return At(i); }
00204 const value_t operator [](UInt_t i) { return At(i); }
00205
00206 T* operator->() { return ROOT::TObjProxy<T>::GetPtr(); }
00207 operator T*() { return ROOT::TObjProxy<T>::GetPtr(); }
00208
00209
00210 };
00211
00212 }
00213
00214 #endif